内联函数
引入
当我们写了一个较为短小的函数(比如10行左右的Add
),并且需要频繁的调用,这时候我们没有必要建立函数栈帧。
C提供了宏函数的解决方法:
宏(包括宏的常量 宏的函数)的优点:a.代码复用性强 b, 宏函数提高效率,减少栈帧建立
宏的缺点:a.可维护性差(针对宏函数而言),可读性差,并且写法复杂 b. 没有类型安全检查 c. 不方便调试
#define ADD(a,b) ((a)+(b))
//一个简单的函数变得很复杂,容易出错
C++给了我们内联函数inline
的解决方法。
内联函数的概念
以inline
修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。
inline Add(int a, int b)
{
return a + b;
}
从汇编代码的角度,内联函数没有建立函数栈帧,直接展开了函数。
而非内联函数建立了函数栈帧,有了调用函数地址的call Add(12C107Dh)
操作。
内联函数有了宏函数的优点,没有了宏的缺点。是C++对于C的一个改进。C++基本不再建议使用宏#define
,尽量使用const
、enum(枚举)
、inline
去替代宏。
内联函数的特性
inline
是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用。 缺陷:可能会使目标文件变大。 优势:少了调用开销,提高程序运行效率。inline
对于编译器而言只是一个建议,不同编译器关于inline
实现机制可能不同,一般建议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、频繁调用的函数采用inline修饰,否则编译器会忽略inline
特性。inline
不建议声明和定义分离,分离会导致链接错误。因为inline
被展开,就没有函数地址了,链接就会找不到。