字节对齐align

作者: 罗蓁蓁 | 来源:发表于2020-05-01 12:20 被阅读0次

    关于对齐的问题,我们经常在运行程序的时候出现对齐异常,面试官也特别热衷于纠结字节对齐的问题,因此,记于此,解惑之。

    show code

    struct st1
      {
        char  a;
        int   b;
        short c;
      }
    

    请问,这个结构体是几个字节?

    答案是:12

    struct st2
      {
        char  a;
        short b;
        int   c;
      }
    

    请问,这个结构体是几个字节?

    答案是:8

    内存对齐规则

    • 对于结构的各个成员,第一个成员位于偏移为0的位置,以后每个成员的偏移量必须是min(#pragma pack(n)指定的数,这个数据成员自身长度)的倍数。
    • 在数据成员完成各自对齐之后,结构体本身也是要进行对齐的,对齐将按照#pragma pack(n)指定的数和结构最大数据成员中,比较小的那个进行。

    分析

    也就是说:两个结构体,仅仅是里面包含的数据类型的位置变了,它的大小就会不一样!

    这就是内存对齐的问题,也是编译器帮我们把每一个数据单元安排在了合适的位置。

    那么,为何st1和st2不一样呢?

    好吧,内存对齐规则说的太专业,其实说白了就是,在没有#pragma pack(n)下,默认都是4字节对齐。

    对于st1,char是1字节,相邻的int是4字节,因此1+4>4了,所以char只能单独享用4字节了,同理short也是一样,因此就是4+4+4=12字节。

    对于st2,char是1字节,相邻的short是2字节,因此1+2<4,所以char和short可以一起享用4字节了,而int在享用4字节,因此就是4+4=8字节。

    晦涩的专业语言把道理精简再精炼,而白话文却能把道理婵婵道来,不得不说,语言的神奇。

    小尾巴

    出差必备:
    买火车票、高铁票、机票,订酒店都打9折的出行工具TRIP,点击注册

    优惠购物:
    你还在傻傻的原价淘宝吗?来这里领取内部优惠券,折扣力度非常大!点击注册,注册需要邀请码UWD9Q9E。

    相关文章

      网友评论

        本文标题:字节对齐align

        本文链接:https://www.haomeiwen.com/subject/phafghtx.html