C++和C99和GNU C都支持内联函数,但是C89却不支持内联函数,Java不支持内联函数,但是编译器会有优化,优化的时候,会有一些强制性的内联扩展。
最终是否使用内联,决定权还是在于编译器。
g++ 编译器真的会开启将你写的一个小内联函数的代码内嵌到调用的地方吗?
哈哈,不会的,不要看到别人说写上inline且是小函数就可以内嵌,其实没有,只有你编译的时候加上优化编译选项 -O
才会真正的将你的内联函数内嵌到你的调用代码的地方。
C++ premier上说:
内联说明(inline specification)对于编译器来说只是一个建议,编译器可以选择忽略这个建议ww.cnblogs.com/alephsoul-alephsoul/archive/2012/10/10/2718116.html
函数开销:
函数调用是有开销的,开销是在函数调用的时候,必须 把当前执行的代码顺序切换到被调用函数的地址,
地址跳换之前需要保存现场,被调函数执行完之后要恢复现场,并按照原来的顺序继续执行代码,所以函数
调用是有一定的时间和空间的开销,所以函数调用是有开销的。
宏调用:
宏调用是在预处理阶段将代码展开,所以宏调用是没有函数调用那些开销的,但是宏调用是有些不尽人意的地方:
1. 宏调用不能访问类的私有成员,
2. 宏定义容易产生二义性,如:#define TABLE_MULTI(x) (x*x)
---------------------这里需要预处理器的支持展开
内联函数:
内联函数避免了一般函数的函数开销和宏定义的缺陷,有两者的长处,内联函数有一般函数的函数体,还可以像宏定义
一样在调用处在编译阶段将代码展开。(编译器要支持代码展开)。但是内联函数和宏定义一样会增加最终程序的体积。
内联函数使用要点:
1. 内联函数必须是声明和定义在一块的,如果不在一块,即使有inline关键字,编译器也会把它做为普通函数处理的。
2. 在C++中,在类内部定义函数体的函数被编译器默认为是内联函数,不管有没有inline关键字。
3. 内联函数在C++中使用较为广泛,主要是用于一些私有数据的存取。
4. 内联函数不允许使用循环和开关语句,如果有,则放弃内联,变为普通函数。
5. 内联函数不能由递归调用
6. 内联函数的函数体不宜过大,1~5行为宜,函数体过大,一般编译器会放弃内联。宏定义就可以定义很大的宏。
要想成为内联函数还是比较苛刻的。