【问题标题】:C++: Inline functions and link time code generationC++:内联函数和链接时间代码生成
【发布时间】:2009-04-02 09:49:05
【问题描述】:

直到不久前,我的代码库还非常接近#include hell。每次我更改一个稍微重要的 .h 文件时,几乎所有文件都会重新编译。
如此高的标头依赖性的主要原因是我有许多需要内联的小函数,我的印象是内联工作它们需要与调用代码在同一个翻译单元中,所以它们需要是在标题中。对于内联函数,甚至编译其他头文件也需要包含在头文件中,ad infimum。

输入link-time code generation(在 Visual Studio 中)。这样做的主要优点之一是现在内联函数可以跨翻译单元。
但我还是很不确定。我怎样才能真正确定这些函数真的被内联了?我意识到无论我在哪里定义函数,编译器基本上都可以做它想做的任何事情。

有没有办法检查内联的内容?

【问题讨论】:

  • 为什么内联这些函数如此重要?这似乎很奇怪。通常,您希望函数内联当它有利于性能时,编译器通常比您更能确定
  • @Rüdiger Stevens - 实际上,这是可能的。查看 /LTCG 标志上的 VC++ 的 :PGINSTRUMENT 选项。 msdn.microsoft.com/en-us/library/xbf3tbeh%28VS.80%29.aspx

标签: c++ visual-studio header inline


【解决方案1】:

我知道在 C++ 中这样说是禁忌,但您可以将这些函数实现为预处理器宏。对不起,我现在去用肥皂漱口。

【讨论】:

  • +1:因为有时它是告诉编译器“内联”你的函数的最后机会,如果它绝对坚持不内联它,即使你绝对知道性能会更好:-)
【解决方案2】:

当然,您并不真正关心事物是否内联 - 您只关心性能是否令人满意。但是,如果您真的想找出答案,请检查编译器生成的代码。您可以通过调试器使用汇编器视图窗口最轻松地完成此操作。

【讨论】:

    【解决方案3】:

    您永远无法确定函数是内联的。由编译器来选择。但是你可以让编译器更容易找到与函数相关的目标代码。

    这就是链接时代码生成的用武之地。编译器不再生成目标代码,它们生成一种形式的中间语言,而真正编译代码的是链接器。

    要检查内联的内容,恐怕您只能生成汇编输出以及目标代码。这使您可以读取调用某个函数时产生的确切目标代码,并且很清楚其中是否存在“调用”。

    【讨论】:

      【解决方案4】:

      一种相对简单的方法是使用分析器。如果函数是内联的,您将不会在控制图中看到它。

      【讨论】:

        【解决方案5】:

        获得可执行文件后,您可以使用工具对其进行检查并在符号表中查找内联函数的名称。一个非常有用的工具是Dependency Walker

        这当然假设您可以获得一个结合了足够的优化设置的构建,以便编译器进行内联,同时保留符号。

        对于 Visual Studio,我认为“发布”版本通常与这些版本相匹配,但我并不完全确定。

        【讨论】:

        • 保留符号在调试信息和优化开启的情况下不是问题,但函数可能在一个地方内联,而不是在另一个地方。
        • Dependency walker 仅列出导出和导入的函数。假设我有符号,如何从中获取文本列表?
        • 糟糕,我的错,我没有意识到。也许'nm' Unix 工具的这个端口可以解决问题:mkssoftware.com/docs/man1/nm.1.asp>.
        猜你喜欢
        • 1970-01-01
        • 2023-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-29
        • 2018-05-19
        相关资源
        最近更新 更多