【发布时间】:2015-07-15 17:59:28
【问题描述】:
我看到了几个关于如何在 C++ 项目中检测不必要的#include 文件的问题。这个问题经常引起我的兴趣,但我一直没有找到满意的答案。
如果包含了一些头文件,而这些头文件没有在 c++ 项目中使用,那会是开销吗?我理解这意味着在编译之前,所有头文件的内容都会被复制到包含的源文件中,这会导致很多不必要的编译。
这种开销在编译后的目标文件和二进制文件中传播到什么程度?
编译器不能做一些优化来确保这 某种开销不会转移到生成的目标文件中,并且 二进制文件?
考虑到我可能对编译器优化一无所知,我仍然想问这个,以防有答案。
作为一名在工作中使用各种 c++ 库的程序员, 我应该遵循什么样的编程实践来避免 这样的开销?让自己对每一个都非常熟悉 图书馆是唯一的出路?
【问题讨论】:
-
这取决于包含文件中的内容。结构声明不会产生任何运行时开销。外部变量声明。
-
@Barmar 声明一个变量(即通知编译器这个名称的变量是在别处定义的)具有运行时间成本?真的吗?怎么样?
-
@Barmar 这取决于您包含的依赖项(上游多远)。只需引入一个远在上游的依赖项(取决于您的构建/重建设置和您更改的内容),您就可以将一个 10 分钟的项目重建变成一个 1.5 小时的重建。
-
@Barmar 当变量在另一个 TU 中定义时,它会在那里初始化,而不是你声明它存在的地方。
-
我觉得你应该去掉C标签。 C 和 C++ 与此完全不同。正如在一些评论中所说,C++ 头文件甚至倾向于定义一些未使用的符号位可能仍然没有被优化。而且编译时间对于 C++ 来说比对于 C 来说更重要。所以两种语言的答案可能会完全不同。
标签: c++ c++11 compilation code-organization