You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 07:45:05