例子
定义两个成员个数相同(3个成员)且成员类型相同(int、char、short)的但是成员顺序不同的两个结构体:
typedef struct {
int i;
char c;
short a;
}FOO1;
typedef struct {
char c;
int i;
short a;
}FOO2;
FOO1 a1;
FOO2 b1;
使用sizeof()测试结构体a1和b1的大小:
sizeof(a1) = 8
sizeof(b1) = 12
可以看到,两个结构体占用的字节大小不同,为什么成员相同的两个结构体的大小不一样呢?这是因为字节对齐的问题。将两个结构体格成员相对于结构体的起始地址打印出来:
&a1.i --> 0
&a1.c --> 4
&a1.a --> 6
&b1.c --> 0
&b1.i --> 4
&b1.a --> 8
内存对齐主要遵循三个规则
- 结构体变量的起始地址能够被其最宽的成员大小整除。
- 结构体每个成员相对于起始地址的偏移地址能都被其自身大小整除,若果不能,则在其前面一个成员后面补充字节。
- 结构体字节大小能够被最宽的成员的大小整除,如果不能则在后面补充字节。
参考:C语言字节对齐问题详解