例子: 假设我在我的预编译头文件中包含:
#include <vector>
由于 vector 的一些实例,例如 std::vector、std::vector 等在我的项目中经常使用,如果我像这样在预编译头文件中实例化它们是否会减少编译时间:
#include <vector>
template class std::vector<float>;
template class std::vector<int>;
更进一步,将虚拟函数添加到使用一些函数的预编译头是否有意义:
namespace pch_detail {
inline auto func() {
auto&& v = std::vector<float>{};
v.size();
v.begin();
v.front();
}
}
我非常不确定翻译单元和模板是如何工作的,所以在我看来,如果我在预编译头文件中实例化它们,这应该意味着它们不需要为每个 .cpp 文件实例化。
更新
使用 Visual Studio 2017 和一些常用模板类的实例在真实代码库上进行了测试。
- 实例化通用模板类:71731 毫秒
- 没有实例化:68544 毫秒
因此,至少就我而言,它花费了更多时间。
最佳答案
是的,它可以有所作为。
然后,翻译单元中的实例化可以利用预编译 header 中的数据,并且编译器可以比 C++ 标准库 header 更快地读取它。
但是您必须维护一个实例化列表,因此这种编译时优化可能比它的值(value)更麻烦 - 如果您拥有不再需要的实例化,您的想法最终可能会产生相反的效果。
关于c++ - 在预编译头文件中实例化模板会减少编译时间吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45370039/