当需要在运行时计算基类的偏移量时,虚拟继承会带来性能开销。

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指针也存在问题。每个子对象(ABCD)都有不同的vtable,并且在调用这些函数时,每个子对象都需要正确的偏移量才能在A中定位数据。

关于c++ - 如果只有一个基础具有数据成员,则虚拟继承的性能开销,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44204427/

10-11 22:38
查看更多