字节对齐问题

一、概念

             首先说说字节对齐这个概念问题,所谓的字节对齐,就是各种数据类型按照一定的规则在空间上排列,而不是顺序的一个接着一个的排放。这个就是对齐。而我们经常所说的对齐在N上,它的含义就是数据的存放起始地址%N==0。(这个N即为有效对齐值)

         原因(为什么进行字节对齐):1、如果不进行字节对齐的话,CPU对某些数据的存取就可能加大存取周期。因为某些平台对某                                                                           些特定类型的数据只能从某些特定地址开始存取。

                                                                  2、进行了字节对齐虽然提高了存取效率,但是同时浪费了空间。

        几个涉及到的重要概念:自身对齐值——即数据类型自身所占字节数。

                                                     指定对齐值——程序指定对齐值

                                                     有效对齐值——前两者取其小

二、例子

       struct A

       {

            char c;

            int i;

            short s;

         }

         我们计算sizeof(struct A),首先假设A的起始地址0x00,(其实A始终在对齐边界上,不过不影响size,这里只是为了计算方便),     接下来步骤如下:

         1、数据成员c的自身对齐值=1,指定对齐值=4(这里我们默认的编译系统为4字节对齐);可以得出有效对齐值=1,因为                          0x00%1=0,所以起始地址存放在0x00处。

          2、数据成员i的自身对齐值=4,指定对齐值=4;可以得出有效对齐值=4,因为0x01%4!=0,因为它被存放在0x04处占用                             0x04,,0x05,0x06,0x07这几个地址。

          3、数据成员s的自身对齐值=2,指定对齐值=4;可以得出有效对齐值=2,因为0x08%2=0,因为它被存放在0x08处占用                             0x04,0x09这几个地址。

          4、最后看数据结构A的起始地址为0x0A%4!=0,因此多占用0x0A和0x0B,所以就是sizeof(struct A)=12。

          



          

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值