【问题标题】:How are function calls within inlined function's body treated?如何处理内联函数体内的函数调用?
【发布时间】:2015-03-08 20:06:01
【问题描述】:

假设我们喜欢以下头文件:

Header1.h

#include "Header2.h"

class A
{
public:
    void Function();
}

inline void A::Function() 
{ 
    // Code ...
    OtherFunction(); // Function from Header2.h
    // Code ...
}

如果编译器确实选择内联Function,调用OtherFunction会发生什么:

  1. 如果OtherFunction 定义可用于当前翻译单元,它是否也可能内联在Function 的正文中? (基本上可以嵌套内联吗?)
  2. 如果OtherFunction 定义不适用于当前翻译单元,它是否仍然是一个简单的函数调用,而它周围的代码会被内联? (在编译器选择内联Function的情况下)

【问题讨论】:

  • 这完全取决于编译器,选择内联的内容。
  • 您可以将内联视为#includ-ing 函数而不是调用它。大致。 OtherFunction 的代码无论如何都会被执行。
  • 1.是的。 2.也许;这将需要 LTO。

标签: c++ inline


【解决方案1】:

当您在发布配置中构建应用程序时,大多数现代编译器实际上会为您内联函数 - OtherFunction 被声明为内联/正常的效果将与编译器决定哪个是更好的选项相同。我当然知道 MSVC10 及更高版本的编译器 (Visual Studio) 会发生这种情况。事实上,内联你想要的任何东西,但编译器最终会控制内联的内容。

一个例子是,如果你的函数调用以某种方式链接,那么在 inline 之后推送和弹出操作将没有意义,你的函数将不会被内联(即使你将它们声明为 inlined )

如果它使事情变得更容易 - 请参阅:

When to use inline function and when not to use it?

Benefits of inline functions in C++?

更重要的是How deep do compilers inline functions?

已经有了很好的解释。

【讨论】:

  • 所以即使OtherFunction 没有用inline 关键字标记并且在单独的.cpp 文件中定义,它仍然可能最终被内联?
  • 如果你看到我提供的链接,你会发现inline 的声明只是对编译器的建议。您的编译器最终将内联它选择的适当内容。优化是您所追求的,而不是内联。
  • 我觉得我的问题不够清楚,所以我将它们编辑得更具体。请再看一遍好吗?
  • @LaurynasLazauskas 你读过this吗?
猜你喜欢
  • 1970-01-01
  • 2010-11-06
  • 1970-01-01
  • 1970-01-01
  • 2021-01-17
  • 2010-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多