内联函数
在C语言中,我们使用宏定义函数这种借助编译器的优化技术来减少程序的执行时间,那么在C++中有没有相同的技术或者更好的实现方法呢?答案是有的,那就是内联函数。内联函数作为编译器优化手段的一种技术,在降低运行时间
上非常有用
内联函数是C++的增强特性之一,用来降低程序的运行时间
。当内联函数收到编译器的指示时,即可发生内联:编译器将使用函数的定义体来替代函数调用语句
,这种替代行为发生在编译阶段而非程序运行阶段
C++内联函数提供了替代函数调用的方案,通过inline声明,编译器首先在函数调用处使用函数体本身语句替换了函数调用语句,然后编译替换后的代码。因此,通过内联函数,编译器不需要跳转到内存其他地址去执行函数调用,也不需要保留函数调用时的现场数据
引入内联函数的目的是为了解决程序中函数调用的效率问题
,这么说吧,程序在编译器编译的时候,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体进行替换,而对于其他的函数,都是在运行时候才被替代。这其实就是个空间代价换时间的节省
。所以内联函数一般都是1-5行的小函数
滥用
内联将导致程序变慢
. 内联可能使目标代码量或增或减, 这取决于内联函数的大小. 内联非常短小的存取函数通常会减少代码大小, 但内联一个相当大的函数将戏剧性的**增加代码大小
关键点
- 内联声明只是一种对编译器的建议,
编译器是否采用内联措施由编译器自己来决定
。甚至在汇编阶段或链接阶段,一些没有inline声明的函数编译器也会将它内联展开 - 编译器的内联看起来就像是代码的复制与粘贴,这与预处理宏是很不同的:
宏是强制的内联展开
,可能将会污染所有的命名空间与代码,将为程序的调试带来困难 - 所有中类中定义的函数都
默认声明为inline函数
,所有我们不用显示地去声明inline 虚函数
不允许内联- 虽然说
模板函数
放中头文件中,但它们不一定是内联的(不是说定义在头文件中的函数都是内联函数) - 内联函数一般都是
1-5行的小函数
- 在内联函数内
不允许使用循环语句和开关语句
- 内联函数的
定义
必须出现在内联函数第一次调用之前