编译器是否C++优化未使用的 #includes
Does C++ compiler optimize out #includes that are not used?
在构建一个不断增长的类/函数库时,我经常看到一种"伞形"头文件,它 #includes 项目的所有常见头文件。 例如:
dsp.h
#include "file1.h"
#include "file2.h"
...
#include "filex.h"
有时我可能需要一切,但有时可能只需要选择的功能/选项。 例如,如果 #include dsp.h,但不要使用 file2.h 中的任何内容,编译器知道吗?它是否可以在构建中对其进行优化?
否则,我的解决方案是将可选代码包装在预处理器指令中,然后定义我需要的内容。也许这是一个更安全、更有效的解决方案?
您是在谈论代码优化还是构建时间优化?
不必要的、未使用的标头不会更改正在生成的代码,因此这里不存在优化的问题。
但是,这将增加构建时间。这不会通过构建工具进行优化。如果您希望优化构建时间,请查看John Lakos的《大规模C++软件设计》一书。
预处理器不执行任何优化。它对代码的语义一无所知,因此无法判断您是否正在使用头文件中的任何内容。所以不,#include
语句没有优化出来。
由于预处理器是独立于C++编译器的程序(和语言),因此预处理器无法知道使用了什么。因此,编译器将收到头文件中的所有内容。
在编译器真正开始生成代码之前,将读取包含文件并将其插入源代码的一部分。
是的。 作为一般规则,程序未引用的内容不会放入最终可执行文件中。 可以将其视为优化。 详细信息因编译器和链接器而异。
相关文章:
- 普通环路未使用gcc 4.8.5自动矢量化
- 在更改for循环的第三部分后,未使用for循环结果
- 使用typeid警告未使用的变量
- C++删除未使用的类属性会导致 std::logic_error
- 警告 C4552:">>":未使用表达式的结果
- (SFML)按下键时,播放器构造函数未使用正确的动画进行更新
- 为什么我会收到警告,指出函数已使用但未定义,以及已定义但未使用?
- 如果我想链接静态库并删除未使用的符号.txt我应该如何处理 Cmakelist
- 可视化C++载体:未使用的容量
- GCC 中 __attribute__((未使用)) 和 __attribute((未使用)) 之间的区别
- 循环访问还包含未使用元素的字符串数组
- Q维德格特关闭事件(..)未使用 QProcess::terminate() 调用
- Visual Studio "fatal error LNK1104: cannot open file"未使用或包含的库
- G++ 编译器是否在未使用返回值的情况下将 constexpr 函数视为常规函数?
- 链接器输入文件未使用,因为链接未完成,我无法获得.o
- 未使用的C++未优化的静态成员函数/变量
- 仅当一个参数中未使用 std::function 时,模板函数替换才有效
- 如何控制或优化或删除或释放 UNION 中未使用的内存
- 未使用的 asm() 在不受支持的体系结构上的行为
- 编译器是否C++优化未使用的 #includes