几个级别的基类是否会减慢c ++中的类/结构?

Bri*_*ndy 14 c++ oop

有几个级别的基类会减慢一个类吗?A派生B派生C派生D派生F派生G,...

多重继承会减慢一个类吗?

Ecl*_*pse 25

非虚函数调用在运行时绝对没有性能损失,根据你不应该为你不使用的内容付出的c ++口头禅.在虚函数调用中,无论您有多少级别的继承或基类数,您通常都需要额外的指针查找.当然这是所有实现定义的.

编辑:如其他地方所述,在一些多继承场景中,在进行调用之前需要调整"this"指针.Raymond Chen描述了它如何适用于COM对象.基本上,在从多个基础继承的对象上调用虚函数可能需要额外的减法和在虚拟调用所需的额外指针查找之上的jmp指令.


Nes*_*cio 6

[深度继承层次结构]通过添加不必要的复杂性极大地增加了维护负担,迫使用户学习许多类的接口,即使他们想要做的只是使用特定的派生类.它还可以通过向不真正需要它们的类添加不必要的vtable和间接性来影响内存使用和程序性能.如果您发现自己经常创建深层继承层次结构,则应该检查您的设计风格,看看您是否已经习惯了这种坏习惯.很少需要深层次的层次结构,而且几乎从不好.如果你不相信,但认为"OO只是不是没有大量继承的OO",那么一个好的反例要考虑的是[C++]标准库本身.- Herb Sutter

  • 谢谢,但这不回答这个问题. (5认同)

Mic*_*urr 5

  • 多重继承会减慢类的速度吗?

正如多次提到的,深度嵌套的单继承层次结构不应为虚拟调用带来额外的开销(高于任何虚拟调用所带来的开销)。

然而,当涉及多重继承时,通过基类指针调用虚函数时有时会产生非常轻微的额外开销。在这种情况下,一些实现让虚拟函数通过一个小 thunk 来调整“this”指针,因为

(static_cast<Base*>( this) == this)
Run Code Online (Sandbox Code Playgroud)

不一定正确,具体取决于对象布局。

请注意,所有这些都非常非常依赖于实现。

参见Lippman的《Inside the C++ Object Model》第4.2章——虚拟成员函数/MI下的虚拟函数