c++ - c++ 模板会使程序变慢吗?

标签 c++ performance templates

我从很多人那里听说,使用模板会使代码变慢。真的是这样吗。我目前正在建立一个图书馆。有些地方如果不创建模板,会导致代码管理问题。到目前为止,我可以想到两个解决这个问题的方法:

  • 使用#defines

  • 使用模板并在头文件/库本身中定义所有可能的类型,但不允许最终用户制作模板实例。

例如typedef Graph<int> GraphI32;等等。

有没有办法限制用户自己创建各种模板实例。

对上述问题的帮助将受到高度重视。

最佳答案

简短的回答是否定的。如需更长的答案,请继续阅读。

正如其他人已经指出的那样,模板没有直接的运行时惩罚——即它们的所有技巧都发生在编译时。然而,间接地,它们可以在某些情况下减慢速度。特别是,模板的每个实例化(通常)都会生成与其他实例化分开且唯一的代码。在少数种情况下,这可能会导致执行速度变慢,只需生成足够的目标代码,使其不再适合缓存。

关于代码大小:是的,大多数编译器可以并将相同实例化的代码折叠在一起——但是通常只有当实例化是真实的时才会出现这种情况完全相同的。编译器将不会插入代码来执行最微不足道的转换,以使两个微小不同的实例相互匹配。例如,一个普通的函数调用可以并且将把 T * 转换为 T const * 所以调用使用 const 或非 const 参数将使用相同的代码(除非您选择在 constness 上重载函数,在这种情况下,您可能专门这样做是为了为这两种情况提供不同的行为)。使用模板就不会发生这种情况——在 T *T const * 上的实例化将导致生成两段完全独立的代码。 可能编译器(或链接器)可能能够在事后合并两者,但并不完全确定(例如,我当然使用过没有的编译器)。

但归根结底,模板对速度的积极影响远大于消极影响。

关于c++ - c++ 模板会使程序变慢吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2442358/

相关文章:

linux - centos cpu使用率很高,但是找不到进程

C++0x 模板函数对象推断

c++ - 我可以有一个要实例化的模板列表,而无需事先实例化吗?

c++ - 在一种方法中使用两个 boost 互斥体?

c++ - 黑客等级最小最大总和

c++ - 尽管有 32 GB 内存,但无法分配 3 GB 浮点指针

C# 性能 - 线性数组访问与随机访问

c++ - 对静态成员的 undefined reference

arrays - Swift removeSubrange 足够快吗?

c++ - 如何使用 C++ 模板根据函数参数值添加代码片段?