【问题标题】:What to put in precompiled header? (MSVC)在预编译头文件中放什么? (MSVC)
【发布时间】:2009-03-27 00:22:06
【问题描述】:

预编译头文件的最佳候选者是什么?我可以将 STL 和 Boost 标头放在那里,即使它们有模板?这会减少编译时间吗? 另外,减少编译时间的最佳 IDE 设置是什么?

【问题讨论】:

  • 我不喜欢使用 PCH。原因是(1)我喜欢 cpp 文件中的第一个包含作为其相应的头文件,所以你知道头文件可以编译(2)我的经验是使用 pch 进行依赖检查并不完全可靠,这会导致增量构建变得不可靠在非常大的项目中。在我看来,平衡而不使用 pch 并享受可靠增量构建的好处会更有效。最新的 Visual Studio 版本可能不再是这种情况 - 我的经验仍然不足以判断。

标签: c++ visual-c++ precompiled-headers


【解决方案1】:

快速回答:STL 和 Boost 头文件确实属于预编译头文件,即使这些头文件定义了模板类。

在生成预编译的头文件时,编译器会解析头文本(一项重要的任务!),并将其转换为针对编译器进行优化的二进制格式。

即使在编译其他 .cpp 文件时会实例化模板类,它们也会从预编译头中的信息实例化,这对于编译器来说读取速度要快得多。


(稍后添加)

您应该包含在预编译头文件中的一件事是作为项目的一部分并且经常更改的文件,即使每个 .CPP 文件都包含这些文件。

原因是这个——预编译头的生成可能需要很长时间,因为boost、stl和windows库都很大。

您可能有一个所有东西都使用的简单文件(例如“StringDefs.h”)。如果 StringDefs.h 包含在 stdafx.h 中,并且一个开发人员接触了 StringDefs.h,那么每个开发人员都必须等到 整个预编译的头文件重新编译。如果将 StringDefs.h 排除在预编译头文件之外,并与每个 .CPP 文件一起解析,速度会快得多。

【讨论】:

  • 这是一个公平的观点 - 包括频繁更改文件会总体上减慢构建时间。
  • 每个 .cpp 文件只能有 1 个预编译头文件,但您的项目中可以有多个预编译头文件。
  • 你不仅要等待PCH重新编译,还要等待每一个使用它的文件。
  • 您是否有任何参考资料可以证实模板确实会得到改进的说法?例如分析结果或编译器文档链接?
  • one developer touches StringDefs.h, then every developer has to wait until the entire precompiled header recompiles。如果 StringDefs.h 几乎没有被触及,我认为这是预期的行为。
【解决方案2】:

对 Andrew Shepherd 的回答进行补充。将预编译的头文件用于项目外部的头文件,用于不经常更改的文件。如果您一直在更改当前项目中的头文件,则可能不值得预编译它们。

【讨论】:

    【解决方案3】:

    我写了一篇关于减少编译时间的技术的文章。在这些技术中,可以找到关于预编译头及其应用程序的帖子here。它还有一个关于最佳实践的部分,您可能会觉得有趣。包含透明处理它的 CMake 脚本。

    【讨论】:

    • 这篇文章不错。
    【解决方案4】:

    将任何内容放入该项目中的大多数 .cpp 文件无论如何都会包含的预编译头文件中。这适用于任何头文件,真的。这允许编译器解析这些文件一次,然后在同一项目的所有 .cpp 文件中重用该信息。

    【讨论】:

    • 我不同意,并在我的回复中写了一个额外的部分来解释原因。
    • 预编译的头文件应该从不包含项目本地头文件
    • 我在一个项目上进行了广泛的工作,该项目遵循了这个错误的建议,而且效率非常低 - 每次编译时,所有内容都会针对任何更改进行编译。
    • "预编译的头文件不应该包含项目本地头文件" 为什么不呢?如果本地头文件是稳定的并且永远不会改变,并且包含在你的应用程序中,你为什么不把它们放在预编译的头文件中呢?
    猜你喜欢
    • 2012-07-09
    • 2011-06-13
    • 1970-01-01
    • 2010-11-20
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    相关资源
    最近更新 更多