在一个大型项目中,我们有很多类(数千个),并且每个类都使用typedef来定义一个特殊的智能指针types。 这个智能指针types是一个模板类。 当我用“gcc -Q”进行编译时,我发现每个类都花费了大量的时间来编译这些智能指针。 那就是我看到smartptr<class1>::methods, then smartptr<class2>::methods... smartptr<class2000>::methods
在gcc处理它们时在屏幕上滚动。
有一个技巧来加速这个过程吗? 这些类从smartptr的angular度来看都是一样的,没有enable_if技巧等等。
我现在正在尝试:
但以上所有都不是一个完整的解决scheme。 我想知道是否还有另外一种方法来优化编译时间,一个让gcc知道的事情是,例如,如果它在分析smartptr的时候能够一次又一次地应用相同的知识,那么看到其他专业化的时候,因为生成代码是相同的。
是的,我知道这当然不是一回事……但这只是一个疯狂的想法。
或者,也许还有其他的技巧,我不知道,可以加快编译。 (为了说明我在说什么,我们可以通过消除其静态成员数据实例化来优化另一个模板,这大大缩短了编译时间,这一点并不明显。
不是特别的GCC,但我认为从非模板基类派生smartptr
的想法听起来像是一个很好的选择。 智能指针是这种方法的一个很好的选择,因为许多重复生成的代码并不关心指针是不是void*
。 (我会尽可能多地移动代码,以便在需要的时候,类模板只能在void*
进行转换。
另外,如果你有成千上万个依赖smartptr
,那么应该首先考虑这个问题。 只有当这个失败的时候,我才会转向smartptr
的客户端代码(在这一点上,避免普通头文件膨胀的技术值得考虑)。
至于extern模板声明 ,我没有这些经验,但它听起来像你需要添加每个typedef
的extern
声明。 值得注意的是,强制完成实例化的相反效果是这样执行的:
template class smartptr<MyClass>;
我会仔细检查这行不伴随你的任何typedef
!
如果代码更改不在标题中,这可能实际上有助于缩短编译时间。 (SRC)