内存对齐:
结构体内成员按自身长度自对齐,即按他们的起点长度必须是自身长度的整数倍对齐
如在32位系统下,int 型的开始地址必须位0,4,8,······这种整形数据类型长度大小的倍数开始
结构体的总大小必须位有效对齐值的整数倍
有效对齐值的确定:
- 当有效对齐值为明确指定时,以结构体内成员的最长者的长度为有效对齐值
- 当用#pragma pack(n)指定时,以n和结构体中最长的成员的长度中较小者为其值
- 当用attribute ((packed))指定长度时,强制按照此值为结构体的有效对齐值
实例:
struct A {
char a; // 1
char b; // 1
char c; // 1
}; // 3 有效对齐值为1
struct B {
int a; // 4
char b; // 1 + (2-1)
short c; // 2
}; //8 有效对齐值为4
struct C {
char b; // 1 + (4-1)
int a; // 4
short c; // 2
}; //12 有效对齐值为4
#pragma pack(2) // 2<4 有效对齐值为2
struct D {
char b; // 1 + (2-1)
int a; // 4
short c; // 2
}; //8