C++-sizeof输出的为什么不一样

发布于 2016-10-13 14:07:13 字数 329 浏览 1169 评论 4

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

晚风撩人 2017-09-10 15:16:41

考虑对齐操作.
在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个字节

甜柠檬 2017-05-03 23:17:22

默认的对齐方式是32位类型对齐到32位地址,16位类型对齐到16位地址,8位对齐到8位;
同时对struct来说按照占内存最大的成员对齐,整个struct起始地址和整个长度都对齐到这个大小。比如有int的struct,地址和长度都对齐到32位(为了定义struct数组的时候满足每个起始地址都对齐的条件)这样可以保证在定义任意长度的struct数组的时候,任意一个成员都满足对齐条件。

所以第一个是
bool 空 空 空
int四个字节
bool 空 空 空

第二个是
int四个字节
bool bool 空 空

瑾兮 2016-11-29 22:32:17

对齐的问题。
结构体或类会按照,占内存最大的成员来进行对齐。
该问题中最大的是int类型 占四个字节。所以按照四个字节对齐。
在B中,第一个bool占一个字节,要填充三个字节。
int 占四个字节。最后一个bool,也要填充三个字节。即12个字节
至于C中
第一个int占四个字节,后面两个bool占两个字节,填充两个字节实现位对齐。即8个字节。

注意填充的字节是未初始化的内存数据,而不是0。
详细参考:http://blog.sina.com.cn/s/blog_74a271040100u15p.html

夜无邪 2016-11-18 17:41:15

字节对齐的问题:
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。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文