关于对齐的问题,我们经常在运行程序的时候出现对齐异常,面试官也特别热衷于纠结字节对齐的问题,因此,记于此,解惑之。
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字节。
晦涩的专业语言把道理精简再精炼,而白话文却能把道理婵婵道来,不得不说,语言的神奇。