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

Size of an array inherited virtually from two classes

考虑以下程序:

#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;
}

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

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

旁注:我认为是 v-table 因为如果将代码编译为 32 位程序,大小将增加 4 个字节(32 位系统中的指针)。此外,如果您删除 virtual 关键字,大小将不再增加,因此这显然与 virtual 调用有关,首先想到的是 v-table.