17

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

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

我现在正在尝试什么:

  • 也许用很少的常用方法制作一个非模板基类
  • 使用 extern 模板类来减少链接符号(和实例化时间?还不确定)

但以上所有都不是一个完整的解决方案。我想知道是否有另一种优化编译时间的方法,一个让 gcc 知道的技巧,例如,如果它解析 smartptr 一次,它可以在看到其他专业时一遍又一遍地应用相同的知识,因为生成代码是相同的。

是的,我当然知道这并不完全相同……但这只是一个疯狂的想法。

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

4

2 回答 2

1

不是特别是 GCC,但我认为smartptr从非模板基类派生的想法听起来不错。智能指针是这种方法的一个很好的候选者,因为重复生成的大部分代码并不关心指针不是void*. (我会尽可能多地转移代码,以便类模板只void*在必要时进行转换。)

此外,如果您有数千个严重依赖smartptr. 只有当它失败时,我才会继续使用smartptr's 客户端代码(此时,避免一般标题膨胀的技术变得值得考虑)。

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

template class smartptr<MyClass>;

我会仔细检查这条线是否不伴随您的任何typedefs!

于 2013-01-11T08:58:04.883 回答
0

预编译头文件

如果您的代码更改不在标头中,这实际上可能有助于减少编译时间。 (源)

于 2012-12-29T16:18:23.693 回答