在C++中,只有在函数被显式声明为
inline
(或在头文件中定义)时,函数才会被内联,还是编译器可以根据需要自行内联函数?inline
(或在头文件中定义)时,函数才会被内联,还是编译器可以根据需要自行内联函数?inline
,编译器也可以内联代码。inline
修饰一个函数,也可以选择不内联。 - Mehrdad Afshari编译器可能会内联任何函数,也可能不会内联。他们可以使用 inline
修饰符作为这个决定的提示,但也可以忽略它。
另外请注意,如果类成员函数在类定义中直接被定义,那么它们具有隐式的 inline
修饰符。
如果我没记错的话,当优化被打开时,编译器会内联任何适合的例程或方法。
来自IBM信息中心的文本:
使用内联说明符只是向编译器建议可以执行内联扩展;编译器可以忽略该建议。
C语言除main函数外,任何函数都可以使用内联函数说明符声明或定义为内联函数。静态局部变量不允许在内联函数体内定义。
C++类声明内实现的函数会自动定义为内联函数。常规C++函数和类声明外的成员函数(除main外)可以使用内联函数说明符声明或定义为内联函数。在内联函数体内定义的静态局部变量和字符串字面值在翻译单元之间被视为同一对象;
你的编译器文档应该告诉你这是实现相关的。例如,根据其手册,GCC从不内联任何代码,除非应用了优化。
如果编译器没有内联代码,则inline关键字将具有与static相同的效果,并且调用代码的每个编译单元都将拥有自己的副本。聪明的链接器可以将它们减少到一个副本。
编译器会进行优化,除非你明确指定相反的操作。
内联扩展可能无法使用的一些情况包括:
内联扩展使程序运行更快,因为消除了函数调用和返回语句的开销。然而,它使程序占用更多的内存,因为定义内联函数的语句在每个调用该函数的点上都会被复制。因此,需要进行权衡。
(如我所读的一本面向对象编程书中所述)
#define
。 - MSalters