Visual Studio的预编译头文件包含什么?

问题描述:

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

考虑这个例子:

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

会包括在所述一组该头中进行预编译结果在矢量<INT>的完整模板实例被编译并添加到.PCH?

给予更多的上下文;如果只对解析树进行预编译,这意味着实例化模板的目标代码仍然会在每个编译单元中创建一次,从而导致编译和链接时间的增加。因此,即使启用了预编译头文件,“统一构建”/减少编译单元仍然是减少构建时间的相关因素。

虽然我不能说对内部PCH, 明确的事情,作为统一构建, 即使vector<int>在PCH完全实例, 我认为统一建立仍具有一定的优势。如你所知,C++必须保持一个定义规则(ODR)。 链接器必须将分散在每个对象文件中的模板定义合并为一个。
也就是说,粗略地讲,C++必须做到以下几点:

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

统一建立可以在一定程度上节省上述负担。
但是,我不能说上述保存将超过您的环境中PCH的非统一编译系统 。