首先说一下结构的存储分配基本方法:按照结构体中成员中成员类型字节数最大的为标准,从上往下对结构体成员进行赋值,若当前成员的字节数小于最大成员字节数,接着为下一个连续分配内存,若下一个的内存分配后会大于最大成员字节数,则为当前成员补齐至最大成员字节数的整数倍。
先举几个例子熟悉一下边界对齐的计算方法:
struct test1
{
char b;
char c;
int a;
};
//最大字节数为int 4字节
//首先给b开辟1个字节 1<4
//紧接着给c开辟一个字节 2<4
//因为再给a开辟4个字节 2+4=6 > 4 所以需要在加a开辟前向b多开辟2字节
//所以1+3+4 = 8
这是测试截图:
其中用地址间隔证明存储分配:
可以看到a地址和b地址间相差为1,而b地址和d地址相差3,这是因为char a 开辟1个字节,char b开辟了三个字节(1个字节为char类型,2个为对齐边界而多开辟的)int d开辟了4个字节,共8字节
在上述例子中进行了一些变换进行验证:
struct test2
{
char b;
int d;
char c;
};
//首先确定最大字节数 : int 4字节
//依次由上至下计算:b开辟了1字节, 1<4
// 继续开辟d ,开辟4字节 ,1+4=5 > 4 因为大于最大成员参数字节且不是其整倍数,所以需要补齐至
//最大成员参数字节数的最小整倍数,即5 需要补至8 ,而这3个多的字节从char b后开辟
//最后开辟c 开辟1字节,8+1 > 4 因为大于且不为最大成员参数字节数整倍数,需要进行补齐,9需要补
//至12,多的3个字节从c后开辟 则结构体长度为12
为了验证,贴上测试截图:
结构存储分配(边界对齐)大概就是这样,可以多换几种类型成员进行练习,熟悉分配原则。