我从许多人那里听说过使用模板会使代码变慢.这是真的吗?我正在建立一个图书馆.有些地方如果没有创建模板,就会导致代码管理问题.截至目前,我可以想到两个解决这个问题的方法:
使用#defines
使用模板并在头文件/库本身中定义所有可能的类型,但不允许最终用户创建模板实例.
例如typedef Graph<int> GraphI32;
等
无论如何,是否限制用户自己创建各种模板实例.
对上述查询的帮助将受到高度重视.
Jer*_*fin 57
最简洁的答案是不.如需更长的答案,请继续阅读.
正如其他人已经指出的那样,模板没有直接的运行时惩罚 - 即他们的所有技巧都发生在编译时.然而,间接地,它们可以在一些情况下减慢速度.特别是,模板的每个实例化(通常)都会产生与其他实例化分离且唯一的代码.在少数情况下,这可能导致执行缓慢,只需生成足够的目标代码,使其不再适合缓存.
编辑:澄清关于代码大小的情况:是的,大多数编译器可以并且将相同实例化的代码折叠在一起- 但通常情况下,实例化的实例完全相同.编译器不会插入代码来执行最简单的转换以获得适合现有实例的用法.例如,正常的函数调用可以/将转换T *
为T const *
使用任何一个const
或非const
参数的调用将使用相同的代码(除非你选择在const
ness 上重载函数,在这种情况下你可能已经专门这样做了为这两种情况提供不同的行为).使用模板,这不会发生-在实例T *
并T const *
会导致两个正在生成的代码完全独立的部分.这是可能的编译器(或链接)也许能够将二者合并后的事实,但不能完全肯定(例如,我当然使用的编译器没有).
模板对速度的积极影响远远超过负面.
sep*_*p2k 20
由于模板实例化在编译时发生,因此使用模板没有运行时成本(事实上模板有时用于在编译时执行某些计算以使程序运行得更快).然而,大量使用模板会导致编译时间过长.
小智 14
不,他们没有.当你发现你已经"听到"某些东西而无法命名来源时,你几乎可以肯定地保证你所听到的是错误的.事实上,模板往往会加快代码速度.
阅读有关该主题的权威书籍,而不是依赖于听力,我推荐使用C++模板 - 完整指南.
它们确实使目标代码更大,因为C++为您使用的每种类型生成代码.但我不相信这会降低执行速度.我没有数字可以暗示它会.
在代码开发,阅读和维护过程中,它确实可以改善您的生活.我不会让编码都市神话阻止你使用一个明显有用的语言功能.
归档时间: |
|
查看次数: |
18327 次 |
最近记录: |