内联函数
通常,如果为函数生成的代码足够小,那么它是内联的一个很好的候选者。为什么这样?如果函数很大并且在循环中内联,则对于所有调用,大函数的代码将被复制,从而导致生成的二进制大小膨胀。但是,有多小就足够了?
虽然内联函数似乎是避免函数调用开销的好方法,但需要注意的是,并非所有标记为 inline
的函数都是内联的。换句话说,当你说 inline
时,它只是对编译器的一个暗示,而不是一个顺序:编译器没有义务内联函数,它可以自由地忽略它 - 大多数都可以。现代编译器更好地进行这样的优化,使得这个关键字现在成为过去的遗迹,当程序员对函数内联的这一建议被编译器认真对待时。即使是未标记为 inline
的函数也会被编译器内联,因为它看到了这样做的好处。
内联作为连接指令
inline
在现代 C++中更实际的用途来自于将其用作链接指令。当定义 (而不是声明)标题中将包含在多个源中的函数时,每个翻译单元将拥有其自己的此函数副本,从而导致 ODR (一个定义规则)违规; 这个规则粗略地说只有一个函数,变量等的定义。为了避免这种违规,标记函数定义 inline
隐式地使函数链接内部。
常见问题解答
我应该何时在 C++中为函数/方法编写关键字’inline’?
仅当你希望在标题中定义函数时。更确切地说,只有当函数的定义可以显示在多个编译单元中时。最好在头文件中定义小(如在一个线性中)函数,因为它为编译器提供了更多信息,以便在优化代码时使用。它还会增加编译时间。
什么时候不应该为 C++中的函数/方法编写关键字’inline’?
如果编译器内联它,你认为代码运行得更快时,请不要添加 inline
。
什么时候编译器不知道何时使函数/方法内联?
通常,编译器将能够比你更好地完成此操作。但是,如果编译器没有函数定义,则编译器无法内联代码。在最大限度优化的代码中,无论你是否要求,通常都会内联所有私有方法。