内存对齐

为什么要内存对齐

  • 硬件原因:有的CPU只支持访问对齐的地址;
  • 性能原因:如果数据存放在未对齐的内存空间中,则CPU需要做两次内存访问,而对齐的内存访问只需要一次。

如何观察

示例代码

#include <stdint.h>
#include <stdio.h>

typedef struct _data_algin_
{
    uint32_t a;
    uint8_t b;
}data_algin_t;

data_algin_t data;

int main(int argc, char const *argv[])
{
    printf("total size:%lx\tmember1 size:%lx\tmember2 size:%lx\n", sizeof(data), sizeof(data.a),sizeof(data.b));

    return 0;
}

执行后的结果

hany@ubuntu:~/lab$ gcc -o data_algin data_algin.c 
hany@ubuntu:~/lab$ ./data_algin 
total size:8    member1 size:4  member2 size:1

可以看到整个结构体变量空间是大于两个成员变量空间之和的。编译器对整个结构体变量做了对齐操作。

引入的问题

会降低空间利用率。在执行写二进制文件操作时,会有“空余”空间,会让解析方误解,产生解析偏差。

解决方法

将所有的结构体成员均定义为CHAR 型。

typedef struct _data_algin_
{
    uint8_t a[4];
    uint8_t b;
}data_algin_t;

重新编译,得到如下结果

hany@ubuntu:~/lab$ ./data_algin 
total size:5    member1 size:4  member2 size:1

这样可以充分利用内存空间,并解决不同架构下的大小端问题。

posted @ 2021-12-13 20:21  海林的菜园子  阅读(38)  评论(0编辑  收藏  举报