当需要在运行时计算基类的偏移量时,虚拟继承会带来性能开销。
class A {...};
class B : virtual public A {...}
class C : virtual public A {...}
class D : virtual public B, virtual public C {...}
如果在上面的层次结构中,唯一具有数据成员的类是“A”,并且这些类都不具有虚函数,则将在运行时计算任何偏移量。 (因此,任何基类的偏移量应为零。)
(我正在尝试设计一个容器类的层次结构,其中“A”具有数据池和所有所需的元数据,并且具有最小的功能。“B”和“C”扩展了该功能,而“D”具有了所有功能我可以从对D的引用转换为对B或C或A的引用,这一点很重要,因为容器中的元素将被频繁访问,所以它应该具有最佳的性能。我正在尝试寻找更好的设计,但是如果在这种情况下没有开销,那么我的问题就可以解决。)
最佳答案
仍将计算偏移量,因为您总是可以添加更多需要该偏移量的类。
class F: public class E, virtual public A { };
class G: public class F, virtual public D { };
在这种情况下,与仅使用
class A
相比,class D
数据可以位于不同的位置。vtable指针也存在问题。每个子对象(
A
,B
,C
,D
)都有不同的vtable,并且在调用这些函数时,每个子对象都需要正确的偏移量才能在A
中定位数据。关于c++ - 如果只有一个基础具有数据成员,则虚拟继承的性能开销,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44204427/