预编译头设计问题

时间:2010-03-23 19:47:02

标签: c++ precompiled-headers

我有使用预编译头的代码。 (之前由其他人完成)

其中包括几个.h文件。

如果我的类使用的普通.h文件当前不在现有的预编译头文件中,那么将它们扔在那里有什么好处?也许是编译速度,但我认为它会稍微清理类/头文件?

对于预编译的标题有什么用,有什么用?

3 个答案:

答案 0 :(得分:5)

请勿依赖预编译标头包含的标头,以便通过从其他源文件中删除这些标头来进行“代码清理”。如果你想停止使用PCH,这会造成噩梦。您始终希望您的依赖项在每个源文件中都是显式的。只需将它们包括在两个地方 - 它就没有任何危害(假设你有适当的包括防护装置)。

多个源文件包含的头文件是包含在PCH中的一个很好的候选者(特别是如果它很长)。我发现我并没有过于严肃地对待很少的标题更改为PCH。但是,这取决于您的整体项目结构。如果您经常进行完整构建,请务必避免此建议。如果要最小化增量重建中的工作,那么这是一个考虑因素。根据我的经验,重建PCH的速度相对较快,而且总体编译速度(大多数情况下)远远超过了编译成本。我不确定所有PCH系统是否足够智能,以确定当PCH中包含的标题发生变化(VC ++)时,不需要重建每个源文件,但显然#include您需要的所有内容每个翻译单位肯定会为此提供便利(另一个理由是依赖于您的PCH所包含的内容)

如果您的编译器支持在编译期间为每个文件显示#include树的选项,这对于识别应包含在PCH中的标头(显示最多的标头)非常有帮助。我最近在一个我正在研究的项目(已经使用PCH,但不是最佳的)上完成了这项工作,并加快了750K系列C ++的构建,从大约1.5小时到15分钟。

答案 1 :(得分:3)

将不变系统包含到预编译头中。这将加快编译速度。不要将您可能更改的任何自己的头文件放入预编译头中,因为每次更改它们时都必须重建整个预编译头。

答案 2 :(得分:0)

这是一个权衡:系统/库标题肯定会出现在PCH中,因为它取决于你的项目中的那些。

我们的项目有大量生成的代码,其更改频率远低于项目的其他部分。这些标题放在PCH中,因为它们需要花费大量时间来处理每个单独的文件。如果你改变它们是昂贵的,但你必须权衡这个成本与在文件中使用它们的更频繁的小额节省。