字节对齐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

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

  • instanceSize

    alignedInstanceSize() word_align:字节对齐:(x + WORD_MASK) & ~...

  • 字节对齐 word_align

  • CSS 字体对齐

    text-align:justify; 两边对齐text-align:left; 左对齐text-align:ri...

  • 水平对齐

    1 水平对齐 文本对齐 text-align h1 { text-align: center } 运行效果: 1-...

  • flutter-布局-position

    控件对齐 Padding Align Center

  • 文本

    文本 text text-align: 文本对齐方式left 左对齐center ...

  • 段落文本

    1.text-align: 文本对齐方式left: 左对齐right:右对齐conter: 居中justify: ...

  • 字节对齐与大端小端与内存区域划分

    字节对齐 C语言字节对齐C语言字节对齐/7213465 大端小端 字节序(大小端)详解从高低地址和高低位开始理解(...

  • CSS对齐方式和格式

    对齐:text-align:left | right | center | justify(两端对齐)垂直对齐:v...

网友评论

    本文标题:字节对齐align

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