编译器是否决定何时内联我的函数(在C++中)?

jke*_*eys 9 c++ compiler-theory compiler-optimization

我知道你可以使用inline关键字,或者只是将一个方法放在类声明ala short ctor或getter方法中,但编译器是否最终决定何时内联我的方法?

例如:

inline void Foo::vLongBar()
{
   //several function calls and lines of code
}
Run Code Online (Sandbox Code Playgroud)

如果编译器认为它会使我的代码效率低下,它会忽略我的内联声明吗?

作为一个副作用,如果我在我的类之外声明了一个getter方法,如下所示:

void Foo::bar() { std::cout << "baz"; }
Run Code Online (Sandbox Code Playgroud)

编译器是否会在内幕中内联这个内容?

Jar*_*Par 15

是的,是否内联代码的最终决定权在于C++编译器.内联关键字是建议,而不是要求.

以下是有关如何在Microsoft C++编译器中处理此决策的一些详细信息

  • 可能根本不可能内联给定的函数.也就是说,应该注意的是,一些编译器至少仍然为您提供了覆盖最终决策的方法 - 例如VC++中的`__forceinline`.这仍然不允许您内联无法内联的函数,但它会覆盖编译器的成本/收益分析. (2认同)

小智 10

在一天结束时,是否内联函数完全取决于编译器.通常,函数在流程方面越复杂,编译器内联它的可能性就越小.而一些函数,如递归函数,根本无法内联.

不内联函数的主要原因是它会大大增加代码的整体大小,从而防止iot被保存在处理器的缓存中.事实上,这将是一种悲观,而不是一种优化.

至于让程序员决定在脚下或其他地方拍摄自己,你可以自己内联函数 - 编写函数中已经存在的函数调用站点的代码.

  • 递归函数可以内联到指定的深度:) (2认同)
  • 编译器如何知道编译时的深度是多少? (2认同)

Mar*_*utz 5

正如其他人所指出的,inline关键字只是建议编译器内联代码。由于编译器通常会内联尚未标记的代码,而不是已标记的内联代码,因此该关键字似乎与or (C++0x 之前的版本)inline一样冗余。registerauto

但是,关键字还有另一件事:它将函数的链接从external(函数的默认设置)inline更改为inline。内联链接允许每个编译单元包含其自己的目标代码副本,并让链接器从最终可执行文件中删除冗余副本。如果这让您想起模板,是的,模板也使用内联链接。