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++必须做到以下几点:
- 实例化模板
- 写入目标文件
- 链路重读目标文件
- 解决ODR
统一建立可以在一定程度上节省上述负担。
但是,我不能说上述保存将超过您的环境中PCH的非统一编译系统 。