编译器是否C++优化未使用的 #includes

Does C++ compiler optimize out #includes that are not used?

本文关键字:#includes 未使用 优化 是否 C++ 编译器      更新时间:2023-10-16

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

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

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

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

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

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

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

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

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

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

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