如何使用 C 模板减少编译时间

新手上路,请多包涵

我正在将我的 C++ 应用程序的一部分从使用较旧的 C 类型数组更改为模板化的 C++ 容器类。有关详细信息,请参阅 此问题。虽然该解决方案运行良好,但我对模板化代码所做的每一个小改动都会导致大量的重新编译发生,从而大大减慢了构建时间。有没有办法从头文件中获取模板代码并返回到 cpp 文件中,以便小的实现更改不会导致重大重建?

原文由 SmacL 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 553
2 个回答

我认为一般规则适用。尽量减少部分代码之间的耦合。将太大的模板头分解成较小的函数组一起使用,这样就不必将整个内容包含在每个源文件中。

此外,尝试使标头快速进入稳定状态,也许可以针对较小的测试程序对其进行测试,这样在集成到较大的程序中时就不需要更改(太多)。

(与任何优化一样,在处理模板时优化编译器的速度可能更不值得,而不是首先找到一种“算法”优化来大幅减少工作量。)

原文由 UncleBens 发布,翻译遵循 CC BY-SA 2.5 许可协议

几种方法:

  • export 关键字 理论上可以提供帮助,但它的支持很差,并在 C++11 中被正式删除。
  • 显式模板实例化(参见 此处此处)是最直接的方法,如果您可以提前预测您将需要哪些实例化(并且如果您不介意维护此列表)。
  • 外部模板,已被多个编译器作为扩展支持。我的理解是 extern 模板不一定让您将模板定义移出头文件,但它们确实使编译和链接更快(通过减少必须实例化和链接模板代码的次数)。
  • 根据您的模板设计,您可能能够将其大部分复杂性转移到 .cpp 文件中。标准示例是一个类型安全的向量模板类,它仅包装了一个类型不安全的向量 void* ;所有的复杂性都在 void* 位于 .cpp 文件中的向量中。 Scott Meyers 在 Effective C++ 中给出了一个更详细的示例(第 2 版中的第 42 项,“明智地使用私有继承”)。

原文由 Josh Kelley 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题