内联函数的初步认识
被inline修饰的函数就是内联函数。
编译期间,内联函数会在调用该函数的地方直接展开,从而不用创建函数栈帧。这也就提升了程序的运行效率,但也会增加可执行程序的大小。
普通函数
这里调用了Add函数,会创建函数栈帧。
内联函数
从汇编中可以看到,这里并没有callAdd函数,而是直接对1和2相加,也就是直接展开了Add函数
内联函数的特性
- inline是一种以空间换取时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,
- 缺陷:可能会使目标文件变大
- 少了调用开销,提高程序运行效率
- inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器的实现)、不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。
- inline不建议声明和定义分离,因为内联函数不进入符号表,如果声明定义分开,则在链接阶段是找不到定义的。
内联函数与宏
内联函数的出现就是为了取代宏,
- 宏的优点
- 增强代码的复用性
- 提高性能
- 宏的缺点
- 无法调试(在预处理阶段就进行了宏替换)
- 无类型安全检查
- 代码可读性差,可维护性差,容易误用
而内联函数的出现完美继承了宏的优点并且解决了宏的缺点。内联函数因为是函数,所以可以调试并且有类型安全检查,而正确的内联函数又会在调用处直接展开。