可能重复:
何时使用内联函数,何时不使用?
在什么情况下可以(不应该)不内联函数(仅限 C++)?
我知道的两个条件是:
1. 如果函数有递归调用
2. 如果函数中有静态变量
inline
是 C++ 的关键字,但内联是编译器后端执行的通用过程,通常在指令序列已经生成之后。
AC 编译器还将内联函数,而 C++ 编译器将内联不是inline
. C++ 编译器也可能inline
由于任何原因无法内联函数。关键字实际存在是为了指定一个函数在不同的翻译单元(源文件)中可能有多个相同的定义。
静态变量对是否可以内联没有特别的影响。也许有些编译器很难链接全局变量引用的结果结构,但这更像是一个错误而不是经验法则。
递归函数也可以内联。递归调用应转换为分支。然后可以通过循环展开来定位分支。
编译成超过一千字节代码的函数通常不会被内联。但是在这种情况下,编译器可能会提供#pragma
指令或特定于平台的属性来强制内联。
阻止函数内联的最大因素是在代码生成时编译器是否无法使用其源代码。链接时优化打开了内联函数的可能性,这些函数是extern
和不是inline
由 DLL 提供的函数当然是不受限制的。但是,您仍然可以通过 JIT 风格的执行引擎运行它,并且可以内联(拼接在一起)它喜欢的任何随机片段。
函数不能被内联的唯一情况是编译单元中没有函数的定义。即使这样也不会阻止链接时间优化器的链接时间内联。
请注意,inline
关键字实际上只是一个提示——编译器可能会选择不使用它来内联函数,而选择不使用它来内联函数。