[英]#include standard files in more than one .cpp, versus #include it in precompiled header affects size of executable?
在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)
参考: https : //bugs.chromium.org/p/chromium/issues/detail?id = 94794
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.