C++-sizeof输出的为什么不一样
class B {
private:
bool m_bTemp;
int m_nTemp;
bool m_bTemp2;
};
class C {
private:
int m_nTemp;
bool m_bTemp;
bool m_bTemp2;
}
cout << sizeof(B) << endl;
cout << sizeof(C) << endl;
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
考虑对齐操作.
在32位机器上测试bool类型占一个字节.
class B 的 m_bTemp占一个字节,然后对齐到4个字节,下面是4个字节的m_nTemp,最后面是m_bTemp2,对齐到4字节,那么整体就是12个字节.
class C的m_nTemp占4个字节,而m_bTemp,m_bTemp2可以放在一起对齐到一个4字节.那么整体占8个字节
默认的对齐方式是32位类型对齐到32位地址,16位类型对齐到16位地址,8位对齐到8位;
同时对struct来说按照占内存最大的成员对齐,整个struct起始地址和整个长度都对齐到这个大小。比如有int的struct,地址和长度都对齐到32位(为了定义struct数组的时候满足每个起始地址都对齐的条件)这样可以保证在定义任意长度的struct数组的时候,任意一个成员都满足对齐条件。
所以第一个是
bool 空 空 空
int四个字节
bool 空 空 空
第二个是
int四个字节
bool bool 空 空
对齐的问题。
结构体或类会按照,占内存最大的成员来进行对齐。
该问题中最大的是int类型 占四个字节。所以按照四个字节对齐。
在B中,第一个bool占一个字节,要填充三个字节。
int 占四个字节。最后一个bool,也要填充三个字节。即12个字节
至于C中
第一个int占四个字节,后面两个bool占两个字节,填充两个字节实现位对齐。即8个字节。
注意填充的字节是未初始化的内存数据,而不是0。
详细参考:http://blog.sina.com.cn/s/blog_74a271040100u15p.html
字节对齐的问题:
B中bool、int、bool对应的字节数分别为1、4、1,为了满足字节对齐,会被填充为4(第一个字节为bool,后3个字节为空)、4、4(第一个字节为bool,后3个字节为空),故为12。
C中int、bool、bool对应的字节数分别为4、1、1,为了满足字节对齐,会被填充为4、4(前两个字节为两个bool,后两个字节为空),故为8。