c++ - 为什么使用预编译 header 会导致构建变慢?

标签 c++ compile-time

我们的解决方案包含 100 多个项目、8000 多个 cpp 文件和 10'000 多个头文件。

我正在努力缩短构建时间。

解决方案中的一个项目仅包含 5 个 cpp 文件,编译大约需要 10 秒。头文件最初包含在 cpp 文件中,但为了准备打开预编译头文件,我将头文件移到了一个 pch.h 文件中。

现在每个 cpp 文件都包含 pch.h 文件。

这本身并没有对编译时间做出任何明显的改变——它仍然是大约 10 秒。

现在当我告诉项目实际使用 pch 文件作为预编译头文件时,编译项目需要 17 秒。

为什么预编译包含的 header 会使项目的构建时间比文件仅由每个单独的 cpp 文件#included 时更长?


更多信息。

我们使用一种称为“集总”的技术 -(单个 cpp 文件不是单独编译的 - 它们每个 #include 到一个项目范围的 cpp 文件中,这是唯一被编译的 cpp 文件)。

对于它的值(value),感谢意大利面条代码,根据“Show Includes”,pch 文件中包含的十几个文件导致包含大约 3000(!)个文件。显然,这需要修复!

预编译的头文件编译后大约130Mb。

如果我们关闭 lumping,单个项目构建(不是整个解决方案)需要 45 秒。如果我们随后打开预编译 header ,构建时间会缩短。

我可能错过了明显的东西,但为什么当打开集中时,打开预编译头会减慢构建速度?

最佳答案

PCH 所做的是对多个源文件 包含的公共(public) header 执行“预处理”/“预编译”阶段。这有助于避免重复“预处理”/“预编译”,并且编译器会为每个源文件加载其先前的状态。

如果你只有一个大源文件,这个“预处理”/“预编译”也需要发生,但总共只需要一次。因此,保存和加载 PCH 文件会引入开销而不会带走任何开销(因为没有任何重复)。

我在这里使用术语“预处理”/“预编译”是因为 PCH 的实现方式因编译器而异,并且可能更倾向于其中一种。

现在,除非您在大部分代码中使用像 Boost 这样的重型模板库,否则清理包含依赖项以加快编译时间通常就足够了,通常是一个相当重要的因素。但这需要维护。

关于c++ - 为什么使用预编译 header 会导致构建变慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22986441/

相关文章:

c++ - 在编译时将 std::array 转换为另一种数据类型?

c++ - 继承错误困境: "invalid use of incomplete type" VS "expected class-name"

c++ - 构造函数初始化列表中的数组

c++ - 不同来源的QT调用函数

c++ - 使用模板生成预先计算的数组?

java - BlueJ错误: incompatible types

c++ - 使用数组的对象的编译时多态性是否可能?

c++ - 如何在构造函数中使用 unique_ptr?

c++ - OpenCV:如何设置像素的 alpha 透明度

c++ - 从基调用派生类的隐藏(非虚拟)方法