一、内联函数
1.1 背景
在大多数的机器上,调用函数都要做很多工作;调用前要先保存寄存器,并在返回时恢复;复制实参;程序还必须转向一个新位置执行。一言以蔽之—— inline 函数避免函数调用的开销。
将函数指定为 inline 函数,(通常)就是将它在程序中每个调用点上“内联地”展开,这个过程发生在编译期;正因为如此,也就不会有后来的链接。头文件包含声明,源文件包含定义这一套典型的模式就行不通了(因为这个需要有链接这个动作)。内联函数的定义也可以放在源文件中,但此时只有定义那个源文件可以使用,而且必须要为每一处使用到该函数的源文件拷贝一份定义,修改维护非常困难。解决办法就是—— inline 函数的定义放在头文件。内联函数应该在头文件中定义。
内联函数是一个用于定义的关键字,不是一个用于声明的关键字。
1.2 与宏的区别
- 本质不同:宏不是函数,inline是函数。
- 处理时机不同:内联函数在编译时展开,宏在预编译展开。
- 功能不同:内联函数可以进行诸如安全检查、语句是否正确等编译功能,宏只是一个简单的文本替换。
- 二义性问题:内联函数不会出现二义性;宏处理时要小心,一般要用括号括起来。
二、参考文献
【1】讲解内联函数
【2】[C++Primer中文版第4版] P346-347