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