2

在构建不断增长的类/函数库时,我经常看到一种“伞形”头文件,它#include 了项目的所有常见头文件。例如:

dsp.h
#include "file1.h"
#include "file2.h"
...
#include "filex.h"

有时我可能需要所有东西,但有时可能只需要选择一些功能/选项。例如,如果#include dsp.h,但不使用 file2.h 中的任何内容,编译器是否知道?是否有可能在构建中对其进行优化?

否则,我的解决方案是将可选代码包装在预处理器指令中,然后定义我需要的内容。也许这是一个更安全、更有效的解决方案?

4

4 回答 4

4

您是在谈论代码优化还是构建时间优化?

不必要的、未使用的标头不会更改正在生成的代码,因此这里不存在优化问题。

但是,它会增加构建时间。这没有通过构建工具进行优化。如果您希望优化构建时间,请查看John Lakos的《大规模 C++ 软件设计》一书。

于 2012-12-09T03:52:44.833 回答
3

预处理器不做任何优化。它对代码的语义一无所知,因此无法判断您是否使用了头文件中的任何内容。所以不,#include语句没有优化出来。

于 2012-12-09T03:49:27.060 回答
1

由于预处理器是与 C++ 编译器分开的程序(和语言),因此预处理器无法知道使用了什么。因此编译器将接收头文件中的所有内容。

于 2012-12-09T03:49:23.977 回答
0

包含文件被读取,并在编译器真正开始生成代码之前插入部分源代码。

是的。作为一般规则,程序未引用的内容不会放入最终的可执行文件中。可以将其视为一种优化。详细信息将根据编译器和链接器而有所不同。

于 2012-12-09T04:03:35.473 回答