本文为L_Ares个人写作,包括图片皆为个人亲自操作,以任何形式转载请表明原文出处。
在扩展1中,我们说到了16字节的对齐,其中说明了CPU在读取内存的时候,是以"块"为单位的,是以"块"读取的,这就利用了空间换时间的成本兑换,那么"块"就需要大小一致,才能达到方便CPU读取的目的。所以这就需要内存对齐。
内存对齐的原则
- 数据成员对齐规则:结构体或者联合体(共用体),即
struct
和union
的数据成员,第一个数据成员放在offset
为0的位置,以后每个数据成员存储的起始位置要从该成员大小或者该成员的子成员大小的整数倍开始存储。
上面说的子成员,比如该成员有子成员,数组,结构体等等都是子成员。
举例:比如结构体里面第一个是int
,int
是4字节,第二个是char
类型的数据,那么int
就放在了offset=0
的位置,而char
则必须从4的整数倍地址的位置开始存储。
- 结构体成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。
举例:struct a
里面有struct b
,b
里面有char
,int
,double
这3个类型的元素,那么b
就必须取其中最大的double
,也就是8字节的整数倍开始存储。
- 收尾工作:结构体的总大小,也就是
sizeof
的结果,必须是其内部最大成员的整数倍,不足的要补齐。
举例:还是struct a
里面有char
,int
,double
这三个类型的元素,那么sizeof
的结果,一定是double
,8个字节的整数倍。因为double
8字节,char
1字节,int
4字节,double
最大,所以sizeof
的结果必须是8的整数倍。
网友评论