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

