结构体的内存对齐

xiaoxiao2021-02-28  124

数据项只能存储在地址是数据项大小的整数倍的内存位置上

例如int类型占用4个字节,地址只能在0,4,8等位置上。

 

内存对齐系数:

每个操作系统都有自己的默认内存对齐系数,如果是新版本的操作系统,默认对齐系数一般都是8,(例如int是4,char是1,long在32位编译时是4,64位编译时是 8)。当操作系统的默认对齐系数与内存对齐的理论产生冲突时,以操作系统的对齐系数为基准。

 

内存对齐产生的原因:

内存对齐是操作系统为了快速访问内存而采取的一种策略,简单来说,就是为了放置变量的二次访问。操作系统在访问内存 时,每次读取一定的长度(这个长度就是操作系统的默认对齐系数,或者是默认对齐系数的整数倍)。如果没有内存对齐时,为了读取一个变量是,会产生总线的二 次访问。

例如假设没有内存对齐(默认对齐系数为8),结构体xx的变量位置会出现如下情况:

struct xx{

        char b;         //0xffbff5e8

        int a;            //0xffbff5e9       

        int c;             //0xffbff5ed      

        char d;         //0xffbff5f1

};

操作系统先读取0xffbff5e8-0xffbff5ef的内存,然后在读取0xffbff5f0-0xffbff5f8的内存,为了获得值c,就需要将两组内存合并,进行整合,这样严重降低了内存的访问效率。(这就涉及到了老生常谈的问题,空间和效率哪个更重要?)。

这样大家就能理解为什么结构体的第一个变量,不管类型如何,都是能被8整除的吧(因为访问内存是从8的整数倍开始的,为了增加读取的效率)!

 

转载请注明原文地址: https://www.6miu.com/read-40373.html

最新回复(0)