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


  1. 在MS Visual Studio编译器中:包括标准库头,如<vector><iostream>。与将其包含在预编译头中一次(最终包含在项目中的所有这些和所有其他.cpp文件中)相比,如果这些二进制文件在某些.cpp文件中多次包含,则生成的二进制文件的大小是否有所影响?

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

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

以下是问题 1 和 2 组合的答案: (不管是自定义标题还是标准标题)

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

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

因此,请避免在公共标头/预编译标头中包含iostream(改用ostream,因为它不会引入静态全局变量)。将iostream包含在实际需要它的.cpp文件中。

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

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

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

最新更新