从两个类虚拟继承的数组的大小

时间:2021-06-26 04:47:39

标签: c++ virtual sizeof base-class

考虑以下程序:

#include<iostream>
using namespace std;
  
class base {
  int arr[10];     
};
  
class b1: virtual public base { };
  
class b2: virtual public base { };
  
class derived: public b1, public b2 {};
  
int main(void)
{ 
  cout<<sizeof(derived);
   return 0;
}

据我所知,由于虚拟基类,数组 arr 在类中仅被继承一次。因此,派生类的 sizeof 应该是 10*4=40 字节。但是,在执行时,该程序将打印 56 作为输出。我什至检查了编译器上 int 的大小,它只有 4 个字节。有人能解释一下额外的 16 个字节是从哪里来的吗?

1 个答案:

答案 0 :(得分:0)

这可能是保存虚函数地址的 v-table 的大小。如果你检查 b1b2,它是 48 个字节,可能是一个指向 v-table 的指针(64 位系统上的指针是 8 个字节)。同样的事情发生在下一个继承增加 8 的大小。

附注:我认为它是 v-table 因为如果你将代码编译为 32 位程序,大小的增加将是 4 个字节(32 位系统中的指针)。另外,如果去掉virtual关键字,大小就不会再增加了,所以很明显跟virtual调用有关,首先想到的是v-table。

相关问题