#include多个.cpp中的标准文件,而#include预编译头中的#include会影响可执行文件的大小吗?

时间:2016-11-29 22:43:32

标签: c++ linux gcc visual-c++

  1. 在MS Visual Studio编译器中:包括标准库标题,如<vector><iostream>。如果在一些.cpp文件中包含它们的次数超过一次,与在预编译的头文件中包含它一次(最终包含在所有这些文件和所有其他文件中{{1})相比,它会对生成的二进制文件的大小产生影响吗?项目中的文件)?

  2. 非标准库的相同问题包括。包含静态库的自定义标头。 (如果它取决于那些头/库中定义的数据大小,那么是的,假设有一些定义。)

  3. gcc / Linux环境怎么样? gcc是否有预编译头概念? (如果没有,请考虑所有.cpp文件中包含的一些常见标题)

1 个答案:

答案 0 :(得分:1)

以下是问题1和2结合的答案:(无论是自定义标头还是标准标头都无关紧要)

如果标头没有引入静态全局变量,则在多个.cpp文件中包含此标头不应影响生成的二进制文件的大小。

如果标头确实引入了静态全局变量,则包含此标头的每个.cpp都有自己的该变量的静态初始化程序版本,增加了生成的二进制文件的大小。一个例子是cout,cin,clog,cerr中的iostream

出于这个原因,避免在公共头/预编译头中包含iostream(使用ostream代替,因为它不引入静态全局变量)。将iostream包含在实际需要它的.cpp个文件中。

您可能还想尝试链接时优化。对于MSVC,在编译标志中使用/GL /O2,在链接标志中使用/LTCG。对于gcc / clang,请使用-flto

(我跳过问题3,因为Cody Gray已经在评论中显示了链接)

参考:https://bugs.chromium.org/p/chromium/issues/detail?id=94794