【发布时间】:2010-03-24 05:14:33
【问题描述】:
我有使用预编译标头的代码。 (以前由其他人完成)
在其中,它们包括几个 .h 文件。
如果我的类使用当前不在现有预编译头文件中的通用 .h 文件,那么将它们扔进去会有什么真正的好处吗?也许编译速度,但我认为它也会清理类/标题?
预编译头文件有哪些注意事项?
【问题讨论】:
我有使用预编译标头的代码。 (以前由其他人完成)
在其中,它们包括几个 .h 文件。
如果我的类使用当前不在现有预编译头文件中的通用 .h 文件,那么将它们扔进去会有什么真正的好处吗?也许编译速度,但我认为它也会清理类/标题?
预编译头文件有哪些注意事项?
【问题讨论】:
不要通过从其他源文件中删除这些标头来依赖预编译标头中包含的标头进行“代码清理”。如果您想停止使用 PCH,这将是一场噩梦。你总是希望你的依赖在每个源文件中都是明确的。只需在两个地方都包含它们——这没有什么坏处(假设你有适当的包含保护)。
由多个源文件包含的头文件是包含在 PCH 中的良好候选者(特别是如果它很长)。我发现我并没有太认真地考虑仅将很少更改到PCH的标头。但是,这取决于您的整体项目结构。如果您经常进行完整构建,请绝对避免使用此建议。如果您想最小化增量重建中的工作,那么这是一个考虑因素。根据我的经验,重建 PCH 的速度相对较快,而且总体上(在大多数情况下)编译的整体加速速度远远超过了重建 PCH 的成本。我不确定是否所有 PCH 系统都足够聪明,可以确定当 PCH 中包含的标头发生更改时不需要重新构建每个源文件(VC++ 是),但明确#includeing 每次翻译中您需要的一切单位肯定会促进这一点(另一个原因你应该不依赖于你的 PCH 包含的内容)
如果您的编译器支持在编译过程中为每个文件显示#include 树的选项,这将有助于识别应该包含在 PCH 中的头文件(出现最多的头文件)。我最近在我正在处理的一个项目中经历了这一点(该项目已经在使用 PCH,但不是最优的),并将 750K 行 C++ 的构建速度从大约 1.5 小时缩短到了 15 分钟。
【讨论】:
将不变的系统包含放入预编译的头文件中。这将加快编译速度。不要将任何您自己可能更改的头文件放入预编译头文件中,因为每次更改它们都必须重新构建整个预编译头文件。
【讨论】:
这是一个折衷方案:系统/库头文件肯定会放在 PCH 中,这取决于您项目中的头文件。
我们的项目有大量生成的代码,与项目的其他部分相比,这些代码的更改频率要低得多。这些标头进入 PCH 是因为它们需要大量时间来处理每个单独的文件。如果您更改它们,它会很昂贵,但您必须权衡该成本与将它们放在文件中更频繁的较小节省。
【讨论】: