c ++:继承和模板性能权衡

时间:2012-04-14 08:27:45

标签: c++ templates inheritance

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

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

有人可以解释一下这里还有其他事情需要考虑吗?

THX! 拉胡

2 个答案:

答案 0 :(得分:3)

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

  • 模板需要可执行文件中的空间,因为每个专业化 需要生成代码。
  • 使用虚函数进行继承需要vtable,所有非静态方法调用都需要一个附加参数(this),并且虚拟函数的调用通过vtable进行间接访问。

所以这是空间与速度的关系。但是你可以享受到这样的好处。两个人在同一个班级中的缺点(参见我的第一句话 - 这些特征与他们想要达到的目标是正交的。)

答案 1 :(得分:1)

你说虚拟函数可能会产生性能开销并且模板实例化具有代码大小开销,但两者都可以减轻,这是非常正确的。

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

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