c++ - 在预编译头文件中实例化模板会减少编译时间吗?

标签 c++ compile-time precompiled-headers translation-unit

例子: 假设我在我的预编译头文件中包含:

#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 和一些常用模板类的实例在真实代码库上进行了测试。

  1. 实例化通用模板类:71731 毫秒
  2. 没有实例化:68544 毫秒

因此,至少就我而言,它花费了更多时间。

最佳答案

是的,它可以有所作为。

然后,翻译单元中的实例化可以利用预编译 header 中的数据,并且编译器可以比 C++ 标准库 header 更快地读取它。

但是您必须维护一个实例化列表,因此这种编译时优化可能比它的值(value)更麻烦 - 如果您拥有不再需要的实例化,您的想法最终可能会产生相反的效果。

关于c++ - 在预编译头文件中实例化模板会减少编译时间吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45370039/

相关文章:

c++ - 需要一种有效的方法来处理 C++ 中的 ReadDirectoryChangesW

c++ - 我无法编译 boost - 找不到 *.o 文件

android - 使用预编译 header 时 GCC 失败且没有消息

c++ - 结合使用PCH,PDB和Zi会导致VS2017令人困惑的C2859编译错误

c++ - Linux 上的预编译头警告(太短,无法成为 PCH 文件)

c++ - 如何为 C 函数建模 OO 风格的接口(interface)?

c++ - OpenGL 裁剪 Z>1.0

Angular,在运行时编译和创建组件

pattern-matching - Raku 能否保证模式匹配是详尽的(在编译时)?

c++ - integral_constant 的编译时 bool 运算?