在c ++ / gcc中优化模板编译时间

在一个大型项目中,我们有很多类(数千个),并且每个类都使用typedef定义了一个特殊的智能指针类型。 这个智能指针类型是一个模板类。 当我使用“gcc -Q”进行编译时,我发现每个类都需要花费大量的时间编译这些智能指针。 这就是我看到smartptr<class1>::methods, then smartptr<class2>::methods... smartptr<class2000>::methods在gcc处理它们时在屏幕上滚动。

有没有一个技巧来加速这个过程? 这些类从smartptr的角度来看都是一样的,没有enable_if技巧等等。

我现在正在尝试的是:

  • 也许用一些常用方法创建一个非模板的基类
  • 使用extern模板类来减少链接符号(并且实例化时间?还不确定)
  • 但以上所有都不是完整的解决方案。 我想知道是否有另一种优化编译时间的方法,让gcc知道,例如,如果它在解析smartptr时能够一次又一次地应用相同的知识,因为生成的代码是相同的,所以在看到其他专业化时会重复使用相同的知识。

    是的,我知道它当然不完全一样......但这只是一个疯狂的想法。

    或者也许还有其他的技巧,我不知道,可以加快编译速度。 (为了说明我在说什么,我们可以通过消除静态成员数据实例化来优化另一个模板,这大大缩短了编译时间,但这根本不明显。)


    不是特别的GCC,但我认为从非模板基类派生smartptr的想法听起来像是一个很好的选择。 智能指针是这种方法的一个很好的选择,因为许多重复生成的代码并不关心指针不是void* 。 (我会尽可能多地移动代码,以便类模板只会在必要的地方从void*投射出来。)

    另外,如果你有成千上万个严重依赖smartptr ,那么应该首先考虑以这种方式将问题扼杀在萌芽状态。 只有在失败的情况下,我才会转向smartptr的客户端代码(在这一点上,避免总体头部膨胀的技术值得考虑)。

    至于extern模板声明,我没有这些经验,但听起来你需要为每个typedef添加一个extern声明。 值得注意的是,强制完成实例化的相反效果是这样执行的:

    template class smartptr<MyClass>;
    

    我会仔细检查一下,这行不会伴随任何typedef


    预编译头

    如果您的代码更改不在标题中,这可能实际上有助于缩短编译时间。 (SRC)

    链接地址: http://www.djcxy.com/p/2461.html

    上一篇: Optimize templates compilation time in c++/gcc

    下一篇: Why not use Double or Float to represent currency?