1

昨天有人问我一个问题,使用继承和模板之间的性能权衡是什么?

我说过在虚函数的情况下,动态链接在继承时会引起一些性能问题。但是,使用模板,专用类将在编译时本身生成,因此除了可执行文件的大小随着专用类的数量而增长之外,没有性能问题。

谁能解释这里是否还有其他需要考虑的事情?

谢谢!拉胡尔。

4

2 回答 2

3

首先 - 在我看来,继承和模板是相互正交的(有关这方面的章节,请参阅 OOSC)。在 C++ 中,权衡基本上归结为:

  • 模板在可执行文件中需要空间,因为每个特化都需要生成代码。
  • 继承虚函数需要一个虚表,所有非静态方法调用都需要一个额外的参数(this),并且对虚函数的调用通过虚表间接调用。

所以这是空间与速度。但是您可以在同一个课程中同时拥有两者的优点和缺点(请参阅我的第一句话——它们想要达到的功能是正交的)。

于 2012-04-14T08:34:12.997 回答
1

您说虚函数可能具有性能开销并且模板实例化具有代码大小开销是非常正确的,但是两者都可以得到缓解。

我不断提醒自己,C++ 是建立在不为你不使用的东西付费的前提下的,所以对于继承的类,你总是可以将公共代码移动到非虚拟函数中以避免 vtable 查找,并且有时会做一个内联方法可以很好地配合编译器的优化,使代码更快(没有函数调用)更小。

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

于 2012-04-14T09:35:35.257 回答