从两个 类 虚拟继承的数组的大小
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的大小,用来保存虚函数地址。如果你检查b1
或b2
,它是48个字节,可能是指向v-table的指针(64位系统上的指针是8个字节)。下一个继承会发生同样的事情,将大小增加 8 个。
旁注:我认为是 v-table 因为如果将代码编译为 32 位程序,大小将增加 4 个字节(32 位系统中的指针)。此外,如果您删除 virtual
关键字,大小将不再增加,因此这显然与 virtual
调用有关,首先想到的是 v-table.
考虑以下程序:
#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的大小,用来保存虚函数地址。如果你检查b1
或b2
,它是48个字节,可能是指向v-table的指针(64位系统上的指针是8个字节)。下一个继承会发生同样的事情,将大小增加 8 个。
旁注:我认为是 v-table 因为如果将代码编译为 32 位程序,大小将增加 4 个字节(32 位系统中的指针)。此外,如果您删除 virtual
关键字,大小将不再增加,因此这显然与 virtual
调用有关,首先想到的是 v-table.