在MS Visual Studio编译器中:包括标准库标题,如<vector>
或<iostream>
。如果在一些.cpp
文件中包含它们的次数超过一次,与在预编译的头文件中包含它一次(最终包含在所有这些文件和所有其他文件中{{1})相比,它会对生成的二进制文件的大小产生影响吗?项目中的文件)?
非标准库的相同问题包括。包含静态库的自定义标头。 (如果它取决于那些头/库中定义的数据大小,那么是的,假设有一些定义。)
gcc / Linux环境怎么样? gcc是否有预编译头概念? (如果没有,请考虑所有.cpp文件中包含的一些常见标题)
答案 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