Inline!一旦被Inline修饰了的函数,它就再也不是函数了!(如果它真的被编译器内联了的话,然而不一定修饰inline之后就会被内联)
inline的位置
我们知道inline会导致代码替换。
所以inline的函数一定要放在头文件里,别人include了这个头文件了,才可以被替换。
隐喻inline
一旦函数被定义在类体内,就是隐喻inline。比如:
1 | class Person |
虽然上面的Eat()
没有明写inline,但是被隐喻了。
inline的问题
- 内联函数可能导致代码膨胀
- 内联函数一旦被改变,所有使用到它的目标文件都必须重新编译(因为inline的本质是替换代码)
什么时候编译器会忽视inline
并不是所有被inline修饰的函数都会变成内联函数。这些情况下编译器不会让它们成为内联函数:
- 某个程序要取inline函数的地址时。因为编译器必须为此函数生成一个outlined函数本体
- 构造和析构函数不能称为内联函数