-
在MS Visual Studio编译器中:包括标准库头,如
<vector>
或<iostream>
。与将其包含在预编译头中一次(最终包含在项目中的所有这些和所有其他.cpp
文件中)相比,如果这些二进制文件在某些.cpp
文件中多次包含,则生成的二进制文件的大小是否有所影响? -
非标准库包含相同的问题。包括静态库的自定义标头。(如果它取决于这些标头/库中定义的数据大小,那么是的,假设有一些定义。
-
gcc/Linux 环境怎么样?gcc 有预编译的头概念吗?(如果没有,请考虑所有.cpp文件中都包含的一些常见标头)
以下是问题 1 和 2 组合的答案: (不管是自定义标题还是标准标题)
如果标头不引入静态全局变量,则在多个.cpp
文件中包含此标头不应影响生成的二进制文件的大小。
如果标头确实引入了静态全局变量,则包含此标头的每个.cpp
都有自己的该变量的静态初始值设定项版本,从而增加生成的二进制文件的大小。一个例子是iostream
cout,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