进行内存对齐操作的原因及详解

  • Post author:
  • Post category:其他

进行内存对齐操作的原因及详解

计算机在从内存中取数据的时候,往往不会一个字节一个字节的取,而是一次性取多个字节,取的个数则取决于计算机的机器字长(计算机进行一次整数运算所能处理的二进制数据的位数,通常也是CPU内部数据通道的宽度)64位一次取8个,32位一次取4个。并且计算机一般都会从0开始取。这种机制也导致了计算机在取同一个大小的变量时,如果变量处于不同的内存位置,获取这个完整变量计算机要从内存中取的次数不一样。比如:

假设一台32位计算机要从内存地址为0x00000004取一个 int(32位)类型的变量,计算机只需要取一次就可以将变量取出从(计算机一次只能取4个字节,0x00000004开始取,取到0x00000007),但是如果要从内存地址为0x00000002取一个int类型的变量,计算机则需要取两次,第一次从0x00000000开始取,取到0x00000003,第二次从0x00000004开始取,取到0x00000007,但只有0x00000002到0x00000005的数据是有效的,其他取出的数据都要被舍弃,这会拖慢计算机的运行速率。所以底层编程人员在编写程序的时候,一定要考虑内存的对齐,这将大大提高计算机访问内存的速率,同时也减少内存浪费的空间。

为何说会浪费内存空间呢?编一个小程序就明白了:

#include<stdio.h>
int main (void){
    typedef struct {
        int a;
        short b;
        double k;
    }A;
    typedef struct{
        int a;
        double k;
        short b;
    }B;
    printf("sizeof(A) = %d\n",sizeof(A));
    printf("sizeof(B) = %d\n",sizeof(B));
}

输出结果:
在这里插入图片描述

显而易见,在结构体组成相同的情况下,两个结构体所占的内存却相差了整整一个字节,所以利用好内存对齐,可以帮我们减少内存的浪费。


版权声明:本文为weixin_42919314原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。