虚拟继承是否增加开销
Does virtual inheritance add overhead
假设我有这个 class:
class A{
};
而这个派生class:
class B : public virtual A{
};
然后没有任何东西来自 B
。
声明 B
虚拟添加不需要存在的开销吗?
是的。访问虚拟基 class 的成员时涉及间接寻址。
我认为虚拟继承可能需要少量的额外开销,尽管这可能取决于编译器如何实现非虚拟继承。
普通继承可以通过简单地将派生 class 的成员连接到基础 class 来实现(类似于将基础 class 作为派生 class).访问基 class 的成员是从对象开头的简单偏移量,就像访问派生 class.
的成员一样
但是对于虚拟继承,必须通过指针进行间接访问。这允许所有从同一个基类虚拟继承的 classes 都有指向基类 class 的共享数据的指针。因此访问基 class 的成员需要首先索引到虚拟指针,取消引用它,然后索引到成员的偏移量。
即使没有进一步的推导,此开销也必须在派生的 class 中,因为编译器无法判断您是否可以在其他获得 link 的编译单元中进一步推导用这个 class 编辑。可以想象它可以使用一些 linker 魔法来 link 不同版本的代码,具体取决于是否有进一步的推导。但这意味着它自己的一些开销,形式为 B
.
的两个版本的代码
有关更多详细信息,请参阅
Memory Layout for Multiple and Virtual Inheritance.
假设我有这个 class:
class A{
};
而这个派生class:
class B : public virtual A{
};
然后没有任何东西来自 B
。
声明 B
虚拟添加不需要存在的开销吗?
是的。访问虚拟基 class 的成员时涉及间接寻址。
我认为虚拟继承可能需要少量的额外开销,尽管这可能取决于编译器如何实现非虚拟继承。
普通继承可以通过简单地将派生 class 的成员连接到基础 class 来实现(类似于将基础 class 作为派生 class).访问基 class 的成员是从对象开头的简单偏移量,就像访问派生 class.
的成员一样但是对于虚拟继承,必须通过指针进行间接访问。这允许所有从同一个基类虚拟继承的 classes 都有指向基类 class 的共享数据的指针。因此访问基 class 的成员需要首先索引到虚拟指针,取消引用它,然后索引到成员的偏移量。
即使没有进一步的推导,此开销也必须在派生的 class 中,因为编译器无法判断您是否可以在其他获得 link 的编译单元中进一步推导用这个 class 编辑。可以想象它可以使用一些 linker 魔法来 link 不同版本的代码,具体取决于是否有进一步的推导。但这意味着它自己的一些开销,形式为 B
.
有关更多详细信息,请参阅 Memory Layout for Multiple and Virtual Inheritance.