内存对齐
为什么要内存对齐
- 硬件原因:有的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
这样可以充分利用内存空间,并解决不同架构下的大小端问题。