7

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

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

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

4

5 回答 5

7

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

于 2009-04-02T18:41:45.987 回答
3

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

于 2009-04-02T09:53:01.337 回答
3

你永远不能确定函数是内联的。由编译器来选择它。但是您可以通过允许编译器找到与函数关联的目标代码来使编译器更容易。

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

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

于 2009-04-02T09:54:36.713 回答
3

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

于 2009-04-02T09:58:27.563 回答
1

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

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

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

于 2009-04-02T09:52:14.660 回答