一、定义
定义: 当函数被声明为内联函数之后, 编译器会将其内联展开, 而不是按通常的函数调用机制进行调用.
目的:引入内联函数的目的是为了解决程序中函数调用的效率问题,这么说吧,程序在编译器编译的时候,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体进行替换,而对于其他的函数,都是在运行时候才被替代。就是个空间代价换时间的节省。
二、与宏函数的差异
类似于宏函数的作用,但是有区别:
1)宏函数缺陷 1:需要将实现“加 括号”,以保证优先级的完整性
2)宏函数缺陷 2:即使加了括号,有些情况,依然有缺陷
3)内联函数本身是一个真正的函数,但宏函数不是函数
4)内联函数具有普通函数的所有行为唯一不同处:内联函数会在适当的地方像定义宏一样展开,可以以空间换时间。因此,内联函数既可以避免宏函数的缺陷,也可以避免普通函数入栈的时间浪费。
三、注意事项
1)在普通函数函数面前加上 inline 关键字,否则视为普通函数
2)如果有函数声明,函数本身和声明必须同时加 inline 关键字,否则视为普通函数
3)任何在“类”内部定义的函数会自动成为内联函数,即使没有使用 inline 说明符。
4)下列情况,普通函数即使指定为内联函数,编译器也可能考虑不按内联编译:
(1) 在内联函数内不允许使用循环语句和开关语句;
(2) 内联函数的定义必须出现在内联函数第一次调用之前;
(3) 函数体过于庞大;
(4) 对函数进行取址操作.
四、总结
1)当函数体比较小的时候, 内联该函数可以令目标代码更加高效. 对于存取函数以及其它函数体比较短, 性能关键的函数, 鼓励使用内联。
2)内联仅仅只是给编译器一个建议,编译器不一定或接受这种建议,有些函数即使声明为内联的也不一定会被编译器内联, 这点很重要。比如虚函数和递归函数就不会被正常内联。因为递归层数在编译时可能是未知的, 大多数编译器都不支持内联递归函数。虚函数内联的主要原因则是想把它的函数体放在类定义内, 为了图个方便, 抑或是当作文档描述其行为, 比如精短的存取函数.
2) 如果你没有将函数声明为内联函数,那么编译器也可能将此函数作内联编译(一个好的编译器将会内联小的,简单的函数)。因此,不用刻意去使用内联函数,可以交给编译器去自行处理。