关于结构体,在计算时候首先想到的就是对其,但是怎样去对其一直是比较头疼的事情,下面将个人理解分享一下:
计算结构体的大小时候,首先要把握的就是第一个数据成员一定是从偏移为0的位置开始存储,其他的数据成员要从自己大小的整数倍开始存储;其次就是补齐工作,结构体的总大小一定是内部数据成员的整数倍,不足的地方就需要补齐。如果结构体中成员变量有其他结构体类型,则该结构体数据成员中所有成员变量的大小都按其中最大的来计算。下面将举例详细介绍这些规则。
例如计算 struct A{
int a;
char b;
double c;
};
第一个数据成员为a,大小为4,存储位置从0~3;第二b大小为1,其整数倍可以是任何数,所以可以从4开始,存储位置为4;第三个c大小为8,存储位置必须从8开始在,则存储位置为8~15;最后一步是补齐工作,整个结构体大小必须是8的整数倍,故最后大小为4+4+8=16;
a | a | a | a | b | 0 | 0 | 0 | c | c | c | c | c | c | c | c |
struct B{
int a;
char b[2];
short c;
};
第一个数据成员为a,大小为4,存储位置为0~3,;第二个为b,大小为1*2,存储的起始位置为1的整数倍4~5;第三个为short,大小为2,存储位置为6~7;故整个结构体大小为8。
struct c{
int a;
char b[2];
short c;
struct A d;
};
第一个数据成员为a,大小为4,存储位置为0~3,;第二个为b,大小为1*2,存储的起始位置为1的整数倍4~5;第三个为short,大小为2,存储位置为6~7;结构体A的变量中包含一个int(4)、一个char(1)、一个double(8),其中最大的为double(8),因此d的大小为3*8=24,故整个结构体大小为8+24=32。