看一个小程序如下:
struct S
{
char c1;
int i;
char c2
};
那么这个结构体在计算 sizeof(S) 的值是多少呢?
是不是1+4+1=6?
答案当然不是 6,这是由于sizeof 在计算字节的时候会有一个字节对齐准则:
1、结构体变量的首地址能够被其成员里面,字节最宽的基本类型成员所整除;
2、结构体的每个成员相对于结构体首地址的偏移量,都是成员大小的整数倍,如有需要,编译器会在成员之间加上填充字节
3、结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要,编译器会在最末一个成员之后加上填充字节
所以上面的结构体中,c1的偏移量为1,i 的偏移量为1+4=5,c1与 i 之间需要填充3个字节,为3+5=8,恰好是整形变量 i 字节大小的整数倍。 c2 的偏移量为9,恰好是c2 一个字节的整数倍,所以不用另外填充字节,加起来就是1+3+4+1=9个字节。 由于这里面最宽基本类型为 int,为4个字节,所以需要另外填充3个字节凑成4的倍数。这样一共是12个字节。
(当到目前变量的总共字节数,不是目前变量的整数倍的时候,需要填充字节,使得总数目是目前字节的整数倍,比如:int i,到 int i 这里的时候总共是5个字节,而 int 型占用的是4个字节,所以需要另外填充 3 个字节,总共是 8 个字节才是 int 的整数倍,而到 char c2的时候,总共是9个字节,恰好是 char 型变量大小的整数倍,所以不用另外增加字节)