微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

我现在正在尝试:

也许做一个非模板的基类与几个常用的方法

使用extern模板类来减less链接符号(和实例化时间?还不确定)

但以上所有都不是一个完整的解决scheme。 我想知道是否还有另外一种方法来优化编译时间,一个让gcc知道的事情是,例如,如果它在分析smartptr的时候能够一次又一次地应用相同的知识,那么看到其他专业化的时候,因为生成代码是相同的。

良好的C ++debugging/ IDE环境的Linux?

如何修复边框和背景之间的空白空间在圆angularbutton?

使用从未装载较长的dynamic库实例化的对象上的主代码库中定义的模板类方法时出现分段错误

尝试实例化函数应该在的模板的Linux gcc挑选

无法为我的LruCache类定义模板化types

是的,我知道这当然不是一回事……但这只是一个疯狂的想法。

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

一些显式的实例不是在G ++中生成

模板func和非模板func呼叫顺序

DLL-导出模板基类的静态成员

模板在不同命名空间中的专门化

用GDBdebugging模板

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

另外,如果你有成千上万个依赖smartptr ,那么应该首先考虑这个问题。 只有当这个失败的时候,我才会转向smartptr的客户端代码在这一点上,避免普通头文件膨胀的技术值得考虑)。

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

template class smartptr<MyClass>;

我会仔细检查这行不伴随你的任何typedef !

预编译头文件

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐