C++虚继承两个类时派生类的大小为何比预期多16字节
#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; }
类大小计算逻辑说明
你观察到的额外16字节是64位编译环境下,虚继承实现机制引入的指针开销,具体构成如下:
- 目前主流C编译器(GCC、Clang等)遵循Itanium C ABI实现虚继承:每个虚继承了基类的子类实例,都会被编译器插入一个虚基类表指针(vbptr),用来在运行时定位共享的虚基类子对象的内存偏移地址,64位环境下单个指针占8字节。
derived类同时继承了b1和b2两个类,二者均为虚继承自base,因此derived实例会分别继承b1的vbptr和b2的vbptr,两个指针合计占用16字节。- 共享的
base类子对象大小为10*sizeof(int) = 40字节,40恰好是8的倍数,满足64位环境下默认8字节内存对齐要求,无额外填充开销。 - 总大小为16 + 40 = 56字节,和程序运行结果一致。
如果是32位编译环境,单个指针占4字节,两个指针合计8字节,总大小会是48字节。
内容的提问来源于stack exchange,提问作者loveofprogramming
相关产品推荐
相关产品推荐

