C ++:内联函数和链接时间代码生成

时间:2009-04-02 09:49:05

标签: c++ visual-studio header inline

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

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

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

5 个答案:

答案 0 :(得分:7)

我知道在C ++中这是禁忌,但你可以将这些函数实现为预处理器宏。对不起,我现在用肥皂洗嘴。

答案 1 :(得分:3)

当然,你并不关心事情是否被内联 - 你只关心表现是否令人满意。但是如果你真的想知道,请检查编译器生成的代码。您可以使用汇编程序视图窗口通过调试器轻松完成此操作。

答案 2 :(得分:3)

您永远无法确定函数是否内联。这取决于编译器选择它。但是,通过允许它找到与函数关联的目标代码,您可以使编译器更容易。

这就是链接时代码生成的地方。编译器不再生成目标代码,它们生成一种中间语言形式,它是实际编译代码的链接器。

要检查内联的内容,我担心您将继续使用目标代码生成程序集输出。这允许你读取在调用某个函数时产生的确切目标代码,并且非常清楚是否存在“调用”。

答案 3 :(得分:3)

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

答案 4 :(得分:1)

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

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

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