难道虚拟继承增加派生类的大小? [重复](Does virtual inheritance in

2019-09-18 03:39发布

可能重复:
对象的大小与虚拟

难道虚拟继承改变派生类的大小? 我执行以下的代码,其中我有两个派生类一个虚拟继承和几乎继承了其它非:

class A {
 public:
int a;
  virtual void a1();
};


class non_vir_der: public A{
 public:
int c;
  virtual void aa();
};


class vir_der: public virtual A{
public:
int d;
virtual void bb();
};

int main()
{
cout<<sizeof(non_vir_der)<<"\n";
cout<<sizeof(vir_der)<<"\n";
return 0;
}

输出:

12(底面4(INT A)+ 4(INT C)+ 4(一个PTR))

16(附加的4?)

再次检查,如果我错过了一些东西,我想所需的最少代码,删除所有整数中的类和输出是:

4

4

第二输出指示两个派生类是相同的尺寸。 为什么vir_der 16在第一次运行时的大小,为什么不是12?

Answer 1:

这个行为是完全实现特定的,有没有关于会发生什么保证。 这就是说,大多数编译器具有躺在附近的基类的单个副本,则具有派生类商店的每个实例的类体中的指针指向一个唯一的实例实现虚拟继承。 这样,如果你投的对象是其虚拟基地,编译器可以发出代码,找出那个对象。 在32位系统中,这意味着虚拟继承可能是由四个字节增加对象的大小,因为你已经观察到的。

那么为什么没有区别,如果没有数据成员? 我不知道,但我猜,这是因为编译器是明智地意识到,如果你有没有数据成员一个虚基类,你永远不要真正需要访问其中包含的任何东西。 因此,该对象可以通过消除额外的指针到虚拟基础进行优化,因为从未有一种方式,它可以访问。 我可能是错关于这一点,虽然。

希望这可以帮助!



Answer 2:

基本上,当你声明一个函数或类虚拟的,编译器实例化一个虚拟

其在向上转型。其实的情况下所需要的指针,将创建一个虚拟指针表

所有虚拟实例存储与他们的实际地址。因此,当你继承

在第二种情况虚类,一个额外的vptr *创建得到。

现在第二个情况,这是为什么4在这两种情况下......这是完全编译器特有的。

应根据简单的逻辑在第二情况下已经在第一壳体1和4。

感谢名单



文章来源: Does virtual inheritance increase the size of derived class? [duplicate]