每个特定平台的编译器都有一个默认的对齐系数,gcc中是4,VC中貌似是8。也可以通过于编译命令#pragma pack(n)来指定该系数,其中n的值经测试只能是1,2和4.
对齐规则:
1、结构体的第一个数据成员放在相对位置为0的地方,以后每个数据成员按#pragma pack(n)中n指定的值和该数据成员自身长度中比较小的那个进行对齐。
2、数据成员完成对齐后,结构体本身也要对齐,按照#pragma pack(n)中n的值和结构体数据成员中最长的长度中较小的进行对齐。
验证(环境:gcc 4.4;sizeof(char)=1;sizeof(int)=4;sizeof(short)=2;sizeof(long)=4;sizeof(long long)=8):
1、默认情况(n=4)
struct st1 {
char ch;//长度1<n,按1对齐,0%1=0,起始相对位置=0;存放区间[0]
int num;//长度4=n,按4对齐, 4%4=0,起始相对位置=4;存放区间[4,7]
long lv;//长度4=n,按4对齐,8%4=0,起始相对位置=8;存放区间[8,11]
};