预编译头设计问题

5

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

在其中,他们包含了几个.h文件。

如果我有使用常见.h文件的类,但这些文件目前不在现有的预编译头文件中,将它们放进去是否真正有益呢?也许能提高编译速度,但我认为这也会使类/头文件更加整洁?

预编译头文件的使用要注意哪些问题和禁忌?

3个回答

6
不要仅仅依赖于预编译头文件中包含的头文件来通过将这些头文件从其他源文件中删除进行"代码清理"。如果你想停止使用PCH,这会造成一场噩梦。你始终希望在每个源文件中都明确列出依赖项,只需在两个地方包含它们--这没有任何伤害(假设你已经采取适当的包含保护措施)。
被多个源文件包含的头文件是包含在PCH中的好候选文件(特别是如果它很长)。我发现我不会太认真地采纳只有很少更改的头文件放入PCH中的建议。但是,这取决于你的整体项目结构。如果你经常进行全量构建,请务必避免此建议。如果你想最小化增量重建的工作量,则需要考虑这一点。根据我的经验,在大多数情况下,重新构建PCH相对较快,并且这种成本远远超过了编译速度的总体加速(除非有特殊情况)。我不知道是否所有的PCH系统都足够聪明,可以在PCH中更改一个头文件时不必重建每个源文件(VC++可以),但是在每个翻译单元中明确地#include你需要的所有内容肯定会促进这一点(这也是你不应该依赖于PCH所包含的内容的另一个原因)。
如果你的编译器支持在每个文件编译期间显示每个文件的#include树的选项,这可以帮助你确定应该包含在PCH中的头文件(出现最多的头文件)。我最近在我正在工作的项目上经历了这种情况(已经使用了PCH,但不是最优化的),将750K行的C ++构建时间从大约1.5小时缩短到15分钟。

3
将不经常变化的系统包含文件放入预编译头文件中,这将加快编译速度。不要将你可能更改的任何自己的头文件放入预编译头文件中,因为每次更改它们都需要重新构建整个预编译头文件。

是的。它也不会“清理”任何位。 - Hans Passant

0

这是一个权衡:系统/库头文件肯定放在PCH中,项目中的头文件则取决于具体情况。

我们的项目有大量生成的代码,与项目的其他部分相比,变更频率较低。这些头文件放在PCH中,因为在每个单独的文件中处理它们需要很长时间。如果你改变它们,代价是昂贵的,但你必须权衡这个成本和将它们放在文件中更频繁的小规模节省之间的差异。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接