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
相关产品推荐
相关产品推荐

