字节对齐align

2020-04-06

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

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字节。

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