关于struct结构体自然对齐的思考

问题:

struct X

         char m_ch;

         int m_count;

 };

 

cout << sizeof(X) << endl;的结果显示为 8。

 按照复合类型所占字节数为结构体中的成员所占字节的总和,得出的结果应该为 5。

多出的3个字节是怎么回事?

 

原来为了提高对象及其成员的访问效率,编译器不会随便地在任意一个逻辑内存地址上创建C++/C的变量和对象,它们的内存中的起始地址

需要满足一定的条件,数据成员也并非一定是挨在一起的,每个数据成员的地址也不是随便安排的,它们都需经过编译器的精心规划和计算。

即对象的地址应该要被数据成员中自然对齐要求最严格的字节数整除(例如,double的变量的地址要能够被8整除,而int变量的地址只需能够被4整除。所以double类型的自然对齐要求就要比int类型严格),其他成员的起始地址也需要满足各自的自然对齐要求。

http://blog.csdn.net/zhangxinrun/article/details/5866504

在以上博客中指出:

网络上也有别的朋友说,是按照结构体里面最大的单元对齐的,这种说法是错误的,原因在于,他举的case全是int最大,而32bit的cpu总是按32-bit对齐正好是int的长度,这样就产生了错误的认识。

struct C
{
    double d;
    char c;
};
sizeof()的大小是12,不是2*sizeof(double)哦。

但我用sizeof(C)求出的结果确实为16。所以按照结构体里面最大的单元对齐的说法应该是正确的,与CPU没有关系。

回到刚刚提出的问题,就很容易明白显示结果为8的原因。对象X的起始地址应该要被4整除。为了m_count满足自然对齐,要为m_ch填充3个字节。

所以总字节数为8!

 

如果以上结果有什么错误的地方,请指出!  继续学习中·····

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值