学习了内存对齐之后的疑问?🤔
1.为啥要内存对齐?
2.内存对齐的规则?
3.内存对齐实例分析。
内存对齐的目的
上网搜了好多相关的资料,主要是由内存的结构和排布的原因。
281623215064_.pic.jpg 271623215057_.pic.jpg
所以编译器如果不进行内存对齐,当取两个,四个或者八个字节的数据就有可能跨chip。这样cpu就要通过两次寻址找到完整数据,并对数据进行拼接,效率上就损失了好多。因此以空间来置换时间,会进行对齐。
内存对齐的规则
1.数据成员对⻬规则:结构(struct)(或联合(union))的数据成员,第
⼀个数据成员放在offset为0的地⽅,以后每个数据成员存储的起始位置要
从该成员⼤⼩或者成员的⼦成员⼤⼩(只要该成员有⼦成员,⽐如说是数组,
结构体等)的整数倍开始(⽐如int为4字节,则要从4的整数倍地址开始存
储。 min(当前开始的位置m n) m = 9 n = 4 9 10 11 12。
2.结构体作为成员:如果⼀个结构⾥有某些结构体成员,则结构体成员要从
其内部最⼤元素⼤⼩的整数倍地址开始存储.(struct a⾥存有struct b,b
⾥有char,int ,double等元素,那b应该从8的整数倍开始存储.)
3.收尾⼯作:结构体的总⼤⼩,也就是sizeof的结果,.必须是其内部最⼤
成员的整数倍.不⾜的要补⻬。
内存对齐实例
下列结构体占用多少内存?
struct LGStruct1 {
double a; //8
char b; //1
int c; //4
short d; //2
}struct1;
struct LGStruct3 {
double a; //8
int b; //4
char c; //1
short d; //2
int e; //4
struct LGStruct1 str;
}struct3;
先来分析LGStruct1的内存排布,按照规则:
-a存放在 0~7;
-b在8;
-c因为9不是4的倍数所以要向后移 9:空 10:空 11:空 (12,13,14,15):c
-d是两个字节,所以16~17:d。
-最后整个内存空间要为最大成员的整数倍,就是24。
然后分析LGStruct3的内存分配:
-a存放在 0~7;
-b在8~11;
-c在12;
-d从14开始放,14~15:d
-e在16~19。
str根据规则2从LGStruct1的成员中最大的成员的整数倍开始存,那么str从24开始。
-str.a :24~31;
-str.b:32;
-str.c:36~39;
-str.d:40~41;
最后调整为最大8的倍数48。
有问题会后续补充
网友评论