由于系统存储结构体需要将结构体变量的地址对齐,并不是每个变量根据自己的类型分配内存,所以结构里面变量不同的顺序会导致结构体的大小不同;
结构体大小计算:
- 偏移量,结构体地址与结构体成员地址的差;
- 结构体大小等于最后一个成员的偏移量与该成员的大小和;
struct grp
{
char ch1;
int in1;
char chr2;
}
计算结构大小是,遵从成员从上到下的原则。第一个成员ch1偏移量为0,因为此时结构体大小等于ch1的大小;第二个成员in1的偏移量为第一个成员ch1的偏移量加大小,即为1,由于结构体中的成员的偏移量必须是成员大小的整数倍(0为任何数的整数倍),in1的大小为4,所以1会被补齐为4,则in1的偏移量为4;第三个变量的偏移量为第二个成员in1的偏移量加上in1的大小,则为4+4 = 8;最后的结构体的大小为最后一个成员的偏移量加上最后一个成员的大小,chr2的大小为1,则结构体的大小为1+9 = 10;但是,结构体的大小必须是结构体中每一个成员大小的整数倍,10不为in1的整数倍,所以这里必须向上补齐为12,则该结构体的大小为12;
为什么说结构的成员顺序会影响到结构的大小?
struct grp2
{
char chr1;
char chr2;
int in1;
}
grp2的结构体的成员与grp的成员一样,但是顺序不一样,但是grp2的结构体大小却为8;
所以,一个结构要想最小,就得考虑到结构体成员的分布;
结构体中嵌套结构体:
当结构体中嵌套结构体时,就需要将嵌套的结构展开,来计算结构体的大小;**不同的是,被展开的结构体,第一个成员的偏移量不再是0,而必须是被嵌套结构体中最大的成员大小得整数倍;**剩下的计算与没有被嵌套的结构体一致;
struct grp3
{
char chr1;
char chr2;
struct grp4
{
char chr01;
int in01;
} dd;
char chr3;
int in1;
}
首先将嵌套的结构体展开:
struct grp3
{
char chr1;
char chr2;
char chr01;//展开后,还成员的偏移量必须是原结构体中最大成员in01大小的整数倍;
int in01;
char chr3;
int in1;
}
则与之前计算相同,chr2的偏移量为1,按顺序计算时,chr01的偏移量为2,但是chr01为被展开的成员,偏移量必须是4的倍数,则偏移量补齐为4;如下计算跟未嵌套时的结构体计算相同,则该结构体的大小为20;