2012-04-14 91 views
1

昨天,我被问到一个问题,使用继承和模板之间的性能权衡是什么?C++:继承和模板性能折衷

我说虚拟函数的情况下,动态链接会导致一些性能问题,当涉及到继承。但是,使用模板时,专用类将在编译时自身生成,因此除了可执行文件的大小随着特定类的数量增加而增加外,没有性能问题。

任何人都可以解释是否有其他事情要考虑吗?

Thx! 拉胡尔。

+2

不知道如果“动态链接”是什么虚拟函数做的通常术语......当然,我从来没有听说过静态与动态库和对象文件的上下文之外使用的词“连接”,所以呃... – cHao 2012-04-14 08:31:05

+5

“动态链接”的正确术语是动态绑定或[动态分发](http://en.wikipedia.org/wiki/Dynamic_dispatch),如果我正确理解你描述的内容 – amit 2012-04-14 08:34:38

+0

@amit你是对的 - 你可以检查这里的术语:http://www.parashift.com/c++-faq-lite/virtual-functions.html – 2012-04-14 08:35:53

回答

3

首先 - 继承&模板在我看来是相互正交的(参见OOSC的章节)。在C++中,权衡基本上归结为:

  • 模板需要可执行文件中的空间,因为每个专业 都需要生成代码。
  • 虚拟函数的继承需要一个vtable,所有非静态方法调用都需要一个额外的参数(this)和调用虚拟函数的方式通过vtable进行间接寻址。

所以它的空间与速度。但是你可以在同一个课堂上有两个好处&(参见我的第一句话 - 这些特征与他们想要达到的特征是正交的)。

+0

yes ..这几乎是我告诉那个人。但他并不太感动。那就是为什么我只是想知道当我们谈论模板时性能事件是否出现。 – rahul 2012-04-14 08:38:46

1

你说虚拟函数可以有一个性能开销并且模板实例化有一个代码开销,但是两者都可以被缓解是非常正确的。我一直不得不提醒自己,C++是建立在不支付你不使用的东西的前提下的,所以对于继承类,你总是可以将普通代码移动到非虚函数中以避免虚表查找,有时使内联方法可以很好地发挥编译器的优化功能,并使代码更快(无函数调用),并且更小。

与模板类似,任何不依赖于模板类型的代码都可以推送到非模板基类中,因此只会有一个函数副本。