Visual Studio的预编译头包含哪些内容?

时间:2011-01-21 08:33:32

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

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

考虑这个例子:

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

在预编译的集合中包含此标头会导致向量&lt; int&gt;的完整模板实例化。正在编译并添加到.pch?

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

1 个答案:

答案 0 :(得分:1)

虽然我不能说PCH的内部,但 至于团结建设, 即使vector<int>在PCH中完全实例化, 我认为团结构建仍然有一些优势。

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

  1. 实例化模板
  2. 编写目标文件
  3. 重新读取链接
  4. 的目标文件
  5. 解决ODR
  6. Unity构建可以在一定程度上节省上述负载 但是,我不能说上面的保存会超过非统一编译 在您的环境中使用PCH的系统。