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

C++中空类对象占1字节,非空类该额外字节去向何方?

C++中空类与非空类的sizeof问题

空类的sizeof表现

class akay
{
};
int main() 
{
    akay object1;
    cout<<"[output] size of "<<sizeof(object1)<<endl; 
    return 0;
}

输出结果:[output] size of 1

非空类的sizeof表现

class akay
{
    int i;
};
int main() 
{
    akay object1;
    cout<<"[output] size of "<<sizeof(object1)<<endl;
    return 0;
}

输出结果:[output] size of 4

核心疑问

已知空类对象会被分配1字节存储空间,为何非空类的对象大小等于类成员大小之和,空类的额外1字节被用于何处?

问题解析

空类分配1字节的本质

C++标准要求同一类型的不同对象必须拥有唯一的内存地址,空类本身没有成员变量,无法通过成员标识对象的存在,因此编译器会自动给空类的对象分配1字节的占位空间,用来确保每个空类对象都有独立的内存位置,满足标准对对象地址唯一性的要求。

非空类中无需额外占位字节的原因

当类包含成员变量时,成员变量本身已经占据了内存空间,不同对象的成员变量会被分配到不同的内存地址,这已经足以区分不同对象,完全满足地址唯一性的要求。此时编译器不再需要额外的占位字节,直接根据成员变量的大小(结合内存对齐规则)计算对象的总大小,因此非空类的sizeof等于成员大小之和(或考虑对齐后的结果),不会额外加1字节。

补充:内存对齐是编译器为提升内存访问效率采取的规则,比如某些类型要求地址是4或8的倍数,这可能导致类的大小大于成员大小之和,但这和空类的占位字节无关。

参考资料提示

  • C++官方标准(ISO/IEC 14882)中关于对象模型的章节,明确了对象地址唯一性要求和类大小计算规则。
  • 《C++ Primer》《Effective C++》等经典C++书籍,均有关于类内存布局、sizeof计算的详细讲解。

内容的提问来源于stack exchange,提问作者AKAY GUPTA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 03:05:01