虚拟继承是否会增加开销

Does virtual inheritance add overhead

本文关键字:增加 开销 是否 继承 虚拟      更新时间:2023-10-16

假设我有这个类:

class A{
};

和这个派生的类:

class B : public virtual A{
};

,然后再也没有源自B

声明B是否需要在那里添加虚拟添加开销?

我认为虚拟继承可能需要少量额外的开销,尽管这可能取决于编译器如何实现非虚拟继承。

正常的继承可以通过简单地将派生类的成员串联到基类(类似于将基类作为派生类的第一个成员)来实现。访问基类的成员是与对象开头的简单偏移,就像访问派生类的成员一样。

但是,通过虚拟继承,必须通过指针有间接。这允许几乎从同一基础继承的所有类都对基类的共享数据有指示。因此,访问基类的成员需要首先索引虚拟指针,将其索取,然后索引到成员的偏移。

即使没有进一步的派生,该开销也必须在派生类中,因为编译器无法确定您是否可以在与此类链接的其他一些编译单元中进一步派生。可以想象,它可以使用一些链接器魔术与代码不同版本的链接,具体取决于是否有进一步的推导。但这意味着以B的两个版本的形式以其自身的开销。

有关其他详细信息,请参阅多个和虚拟继承的内存布局。

是。访问虚拟基类的成员时,涉及间接。