内存对齐->个人面试理解

数据是根据一定顺序放置到内存中的,但是数据类型占据不同大小的字节,因此会使用“内存对齐”的方式划分地址,其作用是规范内存在空间中的存储地址,对于查找来说十分重要。

举个例子:

struct k {
    char a;
    double b;
    char c;
    int d;
};

取这个结构体,char为1b,double 8b,int 4b,如果直接计算是14字节,在经过内存对齐的计算中发现由于一开始最大为8字节(double,如果是int在前4字节能够整除8则可以代替),因此为

1(+7)+8+1+4(+3)这么计算得出为24字节,但如果让我们来查找的话十分困难,因为这只是其中一个例子,但如果我换个顺序又不一样了,因此需要一定的规范来给予地址寻址时有规可循,就存在内存对齐,不要跟字节对齐弄混。

什么是字节对齐

字节对齐:计算机存储系统中以Byte为单位存储数据,不同数据类型所占的空间不同,如:整型(int)数据占4个字节,字符型(char)数据占一个字节,短整型(short)数据占两个字节,等等。计算机为了快速的读写数据,默认情况下将数据存放在某个地址的起始位置,如:整型数据(int)默认存储在地址能被4整除的起始位置,字符型数据(char)可以存放在任何地址位置(被1整除),短整型(short)数据存储在地址能被2整除的起始位置。这就是默认字节对齐方式。

内存对齐针对什么

内存对齐实现的地方一般是如结构体或者联合体等一个对象包含多个成员变量的结构,可以参考一下之前写过的文章

怎么进行内存对齐

对齐方式主要根据对齐系数,首先可以依据预编译命令来改变,但如果不设置的话依据最宽的数据类型作为对齐系数,其余的数据成员会根据该对齐系数存储,如果加起来超过这个系数就需要到下一个规范的地址空间,那剩余空出来的地址编译器会进行填充一定字节,这些字节一般都是无意义的数据,仅仅只是用于方便寻址并且不让查找的时候出错。

猜你喜欢

转载自blog.csdn.net/hoxidohanabi/article/details/128066078