为什么内存对齐


就是内存的对齐方式,为什么要求内存对齐呢,这是cpu的要求,在某些基于RISC(精简指令集计算机)的CPU,如Sparc powerpc等,对内存中的基本数据类型的变量采用高字节在低地址,低字节在高地址的存储 方式 ,在这种自然的存储格式中,要求变量在内存中的位置 必须自然对齐,否则cpu会报告异常。

intel的cpu没有这方面的要求,可以根据情况进行设置,arm的应该也可以,实际上我在arm上也是这样用的,对内存对齐进行自己的设置。

从上面种种消息可以基本推出:

1、字节对齐,可以提高内存查找效率

2、字节对齐的坏处就是:占用内存过多

因此,平衡两点,具体问题具体分析
所谓自然对齐,就是基本数据类型的变量不能简单的存储于内存的任意位置,它们的起始地址必须能够被它们的大小整除。


内存对齐的两种方式


有两种方法:
一是gcc的方式,如下:

1 #include<stdio.h>
  2 struct unpacked_str{
  3 char c;
  4 int x;
  5 };
  6 struct packed_str{
  7 char c;
  8 int x;
  9 }__attribute__((packed));
 10 
 11 int main()
 12 {   
 13     printf("size of char=%lu\n",sizeof(char));
 14     printf("size of int=%lu\n",sizeof(int));
 15     printf("size of unpacked_str=%lu\n",sizeof(struct unpacked_str));
 16     printf("size of packed_str=%lu\n",sizeof(struct packed_str));
 17 }
~     
root@mkx:~/learn/packed# gcc packed.c -o packed
root@mkx:~/learn/packed# ./packed
size of char=1
size of int=4
size of unpacked_str=8
size of packed_str=5
root@mkx:~/learn/packed# 


别一种编译指令方式:

 1 #include<stdio.h>
  2 struct unpacked_str{
  3 char c;
  4 int x;
  5 };
  6 #pragma pack(push, 1)
  7 struct packed_str{
  8 char c;
  9 int x;
 10 };
 11 #pragma pack(pop)
 12 
 13 int main()
 14 {   
 15     printf("size of char=%lu\n",sizeof(char));
 16     printf("size of int=%lu\n",sizeof(int));
 17     printf("size of unpacked_str=%lu\n",sizeof(struct unpacked_str));
 18     printf("size of packed_str=%lu\n",sizeof(struct packed_str));
 19 }
root@mkx:~/learn/packed# ./packed2
size of char=1
size of int=4
size of unpacked_str=8
size of packed_str=5
root@mkx:~/learn/packed# 


内存对齐的内存映像


上面两种方式,效果是一样的,其内存映射如下:


通过上面可知,指定1为内存对齐方式,非常的节省内存,可以说一点内存都没有浪费,如果是默认,默认内存对齐是4,4的话,就浪费了3个字节的空间,

这还是小结构体,如果是大结构体,再加上数组的形式,那为了内存对齐,而占用的内存,还是非常大的。
对于嵌入式开发来说,这个还是特别注意的。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐