5

问题涉及由 Visual Studio 编译器创建的 .pch 二进制文件的内容。它包含什么?它只是头文件的解析树,还是目标代码?

考虑这个例子:

// myheader.h
#include <vector>
class A {
public:
  void add(int i) { v.push_back(i); }
private:
  std::vector<int> v;
};

在要预编译的集合中包含此标头会导致 vector<int> 的完整模板实例被编译并添加到 .pch 中吗?

提供更多背景信息;如果只预编译解析树,这意味着实例化模板的目标代码仍将在每个编译单元创建一次,从而增加编译和链接时间。因此,即使启用了预编译头文件,“统一构建”/减少编译单元仍然是减少构建时间的一个相关因素。

4

1 回答 1

1

虽然PCH的内部我不能说清楚,但对于unity build,即使vector<int>在PCH中完全实例化,我认为unity build还是有一些优势的。

您可能知道,C++ 必须保持单一定义规则(ODR)。链接器必须将分散在每个目标文件中的模板定义统一为一个。
也就是说,粗略地说,C++ 必须做到以下几点:

  1. 实例化模板
  2. 写入目标文件
  3. 重新读取链接的目标文件
  4. 解决 ODR

Unity 构建可以在一定程度上节省上述负载。
但是,我不能说上述节省会超过您环境中使用 PCH 的非统一编译系统。

于 2011-01-21T14:10:08.793 回答