结构体
typedef struct A
{
char c1;
char c2;
int i;
}A;
typedef struct B
{
char c1;
int i;
char c2;
}B;
typedef struct C
{
int i;
char c1;
char c2;
}C;
对于结构体A,B,C.它们具有同样的结构体成员,只是调换了先后顺序,我们来观察它们的大小是否相同?
int main()
{
printf("结构体A:%d\n",sizeof(A));
printf("结构体B:%d\n",sizeof(B));
printf("结构体C:%d\n",sizeof(C));
return 0;
}
结果显示在sizeof计算结构体大小时,经常得到的值比结构体成员所占内存总和要大,这是因为成员在存储时有对齐的规则。
结构体对齐的规则
1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。
3、结合1、2可推断:当#pragma pack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果。
先来剖析一下上述结构体的内部存储结构: