结构体字节对齐问题
1.引出问题
我们先来看两个小程序
#include <stdio.h>
struct fiber1
{
char p1;
short p2;
int p3;
}
struct fiber2
{
char p1;
int p3;
short p2;
}
main()
{
printf("the size of fiber1 is %d\n",sizeof(fiber1));
printf("the size of fiber2 is %d\n",sizeof(fiber2));
}
运行结构是:the size of fiber1 is 8
the size of fiber1 is 12
我们发现我们只是改变了变量在结构体的位置,但是运行结果却不一样。
2.原因
我们发现在vc++中,为结构体变量分配内存时与c语言不同。
其规则是:
在vc++中,为结构体变量分配内存时,先分配一个单位长度,然后在这个单位长度中依次为结构体内的变量分配空间,直到该单位长度空间不能变量分配一个完整的空间为止。再为变量分配一个单位空间。
类型 对齐方式(变量存放的起始地址相对于结构的起始地址的偏移量)
Char 偏移量必须为sizeof(char)即1的倍数
Short 偏移量必须为sizeof(short)即2的倍数
int 偏移量必须为sizeof(int)即4的倍数
float 偏移量必须为sizeof(float)即4的倍数
double 偏移量必须为sizeof(double)即8的倍数
各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照上面的对
齐方式调整位置,空缺的字节VC会自动填充。同时VC为了确保结构的大小为结构的字节边
界数(即该结构中占用最大空间的类型所占用的字节数)的倍数,所以在为最后一个成员
变量申请空间后,还会根据需要自动填充空缺的字节。