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

Vik*_*tor 5 c++ templates precompiled-headers visual-studio

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

考虑这个例子:

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

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

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

Ise*_*ria 1

虽然我不能确切地说PCH的内部,但对于unity builds来说,即使vector<int>在PCH中完全实例化,我认为unity builds仍然有一些优势。

如您所知,C++ 必须保留单一定义规则(ODR)。链接器必须将分散在每个目标文件中的模板定义合并为一个。
也就是说,粗略地说,C++ 必须执行以下操作:

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

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