在一个大型项目中,我们有很多类(数千个),并且为每个类使用typedef定义了一种特殊的智能指针类型。这种智能指针类型是模板类。当我用“gcc -Q”进行编译时,我看到很多时间花在为每个类编译这些智能指针上。那就是我在gcc处理它们时看到smartptr<class1>::methods, then smartptr<class2>::methods... smartptr<class2000>::methods
在屏幕上滚动。
有加快这个过程的技巧吗?从smartptr的角度来看,这些类都是相同的,没有enable_if技巧,等等。
我现在正在尝试的是:
但是以上所有内容都不是完整的解决方案。我想知道是否还有另一种优化编译时间的方法,这是使gcc知道的一种技巧,例如如果它一次解析了smartptr,则可以在看到其他专业时一遍又一遍地应用相同的知识,因为生成的代码是相同的。
是的,我知道这当然不尽相同...但这只是个疯狂的主意。
也许还有其他我不知道的技巧,可以加快编译速度。 (仅给出我在说什么的想法,我们可以通过消除其静态成员数据实例化来优化另一个模板,这大大减少了编译时间。这一点都不明显。)
最佳答案
不是专门针对GCC,但我认为从非模板基类派生smartptr
的想法听起来像是一个不错的选择。对于这种方法,智能指针是一个很好的选择,因为重复生成的许多代码都不关心指针不是void*
。 (我将尽可能多地转移代码,以使类模板在必要时仅能在void*
之间进行强制转换。)
另外,如果您有成千上万个严重依赖smartptr
的类,则应首先考虑以这种方式解决问题。只有在失败的情况下,我才继续使用smartptr
的客户端代码(在这一点上,避免一般 header 膨胀的技术值得考虑)。
至于extern template declarations,我没有经验,但是听起来您需要为每个extern
添加一个typedef
声明。值得注意的是,强制完成实例化的相反效果是这样执行的:
template class smartptr<MyClass>;
我会仔细检查此行是否不伴随您的
typedef
!