结构体内存对齐
//结构体大小,存在内存对齐问题
(1)先定义一个结构体A,并将其初始地址设为100
我们通常认为a先申请1个字节,b在申请4个字节大小空间,结构体A总共占5个大小字节
100 101 102 103 104 105 106 107
a | b | b | b | b |
|
1+4=5个字节,但其实不是这样
我们来看下结构体正真的申请内存情况:
100 101 102 103 104 105 106 107
a | \ | \ | \ | b | b | b | b |
1+3+4=8字节
因为计算机读取数据时,一般标准化4个4个字节读取,所以为了节约时间,我们浪费3个字符大小的内存地址,以空间换取时间。
我们可找出计算结构体的规律
(2)
结构体大小为8,规则和(1)相同,(1+1)+2+4=8(每个类型写起来,上面是否能整除下一行)
(3)
(4)
按照以上规则结构体D应该为(1+3)+4+2=10字节,但实际上12字节
现在我们来考虑一下假设结构体数组的存在:
struct D arr[2];
这时arr[1]的地址可能会出现这种情况:
_________________________________________arr[0]________________|_____________arr[1]___________________
这时候计算机以标准4个4个读取时,会在第三个绿色框框处出现问题,读取失败,不是我们需要的值。
所以我们为了避免这个情况,我们会给arr[1]结尾出补上两个字符,就不会出现读取错误了。
这时我们回头看④:我们会发现结构体大小 =(1+3)+4+2+2 = 12个字节
我们可以找出规律计算结构体的大小时避免出现以上问题:
就是在计算出结构体大小时,用所得值对结构体内最大的成员大小取余,看是否==0;
如果!=0,我们给补上一个合适大小的内存,让取余==0 。
最后我们总结一下结构体内存对齐的规则:
①:每一行和前面行总和比,不能被整除,则补上。
②:算出总共大小后和单个最大比,不能被整除,则补上