模板类的许多实例会影响性能吗?

时间:2014-03-06 22:53:38

标签: c++ templates

我的设计有两个选择。一种是使用一个带有

之类的参数的类
A::A(int i)

另一种是使用像

这样的模板
A<i>

我有许多对象A&lt; 1&gt;(),A&lt; 2&gt;()等等。我想知道第二种方式是否会显着影响执行和编译性能。

1 个答案:

答案 0 :(得分:3)

除非你需要,否则你应该从不做异国情调的事情(我认为非类型模板参数有点异国情调)。如果您需要提高速度,大小,编译时间等,您可以随后返回重构。话虽如此, 的区别是什么?

通过声明一堆模板类,您基本上是使用该参数一遍又一遍地复制粘贴类定义。这有一些影响:

编译和链接时间:

您不仅要声明N个类,模板也无法将其主体分成翻译单元。这意味着在每个翻译单元中使用它们时,它们都会被实例化。这可能会大大减慢编译和链接时间。

代码大小和碎片:

因为每个类都是独立的,所以每个类都有自己的功能。这通常会导致代码大小的增加,因为即使代码非常相似,它们也是具有自己的成员函数的独立类型。由于缓存,代码大小的增加也会对性能产生负面影响,因为必须加载更多代码才能保持程序流畅。

<强>限制:

因为类是他们自己的类型,所以模板化的类不会彼此“知道”。它们不能存储在相同的数组,向量,列表,映射等中。您可以执行一些多态魔术来存储指向共享库的指针,但是一堆指针通常比本地化的数组或向量执行得更糟。您也无法根据输入执行A的任何运行时构造。这可能适用也可能不适用,但也要考虑未来。你绝对从不需要基于某些运行时变量构建吗?你绝对从不需要在某个地方持有一个A阵列吗?

编译参数的时间知识:

现在这是一个主要的好处。你知道编译时i。这意味着你可以做一些非常漂亮的事情。使用C ++ 11,您可以编写constexpr方程式(或者在C ++ 14中,更漂亮的constexpr方程式。)您可以在编译时进行metatemplate编程以创建其他东西。这导致一些独特的情况,可以减少主要复杂性和编译/链接时间成本的执行时间。但在某些情况下,这是必要的。我不会选择涉及此问题的解决方案,除非剖析也告诉我。