前言
目录
一、问题引入
我们每次去调用函数的时候,都会有消耗(建立栈帧等等)。假设我现在要调用100次Add
函数,那么就要建立100个栈帧
在C语言中,为了防止如此大的消耗,我们通常用宏函数来解决问题。宏函数的优势:不需要建立栈帧,提高调用效率。
宏既然有优点,那一定就会有缺点(复杂、不易调试、代码可读性差),那就是特别容易书写写错误。因此,Bjarne Stroustrup
大佬看不下去了,于是自创了一个新语法 — 内联函数
二、内联函数的概念
所以,在【问题引入】中,用内联函数表示方法如下:
通过以上代码,我们可以看出内联函数的优点是(解决了宏的缺点):
①不需要建立栈帧
②不复杂、不容易出错、可读性好、容易调试
三、内联函数的特性
-
inline
是一种以空间换时间的做法。假如有一个Func函数有50
行指令,假设某个项目要调用1w
次Func
函数,如果不使用内联函数,就会有1w+50
行指令;如果使用内联函数,在编译阶段,会用函数体替换函数调用,就会1w*50
行指令,这会导致最后可执行程序(安装包)变大,谁会希望一个程序的安装包大呢?这就是代码膨胀,因此不能让所有的函数变成内联函数 -
inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,最终是否会称为inline,编译器自己决定。
- inline不建议声明和定义分离,
看似没错,其实程序最后会报错
这是因为:分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到
所以内联函数的定义和声明一定要在一起