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

C++中类的sizeof计算疑问:为何结果为1、4、8?

关于C++中空类与类大小的两个疑问解答

先给你理清楚背后的核心规则:空类的占位规则和内存对齐优化,这两个点正好对应你的两个问题。

疑问1:为什么sizeof(A)=1而不是预期的4?

首先得明确:C++标准规定,任何非空对象都必须拥有唯一的内存地址,所以空类Base会被编译器分配1字节的占位空间(这就是sizeof(Base)=1的原因)。

那为什么包含Base成员的类A大小还是1?这是因为编译器做了空成员优化(Empty Member Optimization):当一个类的成员是空类类型时,这个空成员不需要额外占用独立的内存空间——因为它本身没有任何数据需要存储,编译器可以把它的占位和类A自身的占位合并,所以A的大小依然是1字节,而不是你以为的“空类大小+类本身大小”或者对齐到4字节。

简单说:空成员只是个“标记”,不需要实际占额外空间,所以A的大小和空类一样是1。

疑问2:为什么sizeof(C)=8而不是1+4=5?

这是**内存对齐(Memory Alignment)**的要求,编译器为了提升CPU访问内存的效率,会给不同类型的成员分配符合其对齐要求的内存地址。

在你的环境中,int类型要求4字节对齐(也就是它的起始地址必须是4的整数倍)。类C的内存布局是这样的:

  • 首先是Base a,占1字节;
  • 接下来要放int b,但当前地址不是4的倍数,所以编译器会自动填充3个字节的空白数据(padding);
  • 然后int b占4字节,正好从地址4开始(符合对齐要求)。

加起来就是1 + 3(填充) + 4 = 8字节,所以sizeof(C)=8。

附上你的测试代码

class Base{};
class A{ Base a; };
class B{ int b; };
class C{ Base a; int b; };

int main() {
    int a = sizeof(A);//1
    int b = sizeof(B);//4
    int c = sizeof(C);//8
    cout<<a<<endl;
    cout<<b<<endl;
    cout<<c<<endl;
    return 0;
}

内容的提问来源于stack exchange,提问作者rz yin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 18:19:05