繁体   English   中英

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

[英]#include standard files in more than one .cpp, versus #include it in precompiled header affects size of executable?

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

  2. 非标准库的相同问题包括。 包括静态库的自定义标头。 (如果取决于在这些头文件/库中定义的数据大小,则可以,假设有一些定义。)

  3. 那么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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM