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中吗?
提供更多背景; 如果只预编译了解析树,这意味着每个编译单元仍然会创建一个实例化模板的目标代码,导致编译和链接时间增加.因此,即使启用了预编译头,"统一构建"/减少编译单元仍然是减少构建时间的相关因素.
虽然我不能确切地说PCH的内部,但对于unity builds来说,即使vector<int>
在PCH中完全实例化,我认为unity builds仍然有一些优势。
如您所知,C++ 必须保留单一定义规则(ODR)。链接器必须将分散在每个目标文件中的模板定义合并为一个。
也就是说,粗略地说,C++ 必须执行以下操作:
Unity 构建可以在一定程度上节省上述负载。
但是,我不能说上述节省会超过您环境中使用 PCH 的非 unity 编译系统。