大家好,欢迎来到IT知识分享网。
为什么内存对齐
就是内存的对齐方式,为什么要求内存对齐呢,这是cpu的要求,在某些基于RISC(精简指令集计算机)的CPU,如Sparc powerpc等,对内存中的基本数据类型的变量采用高字节在低地址,低字节在高地址的存储 方式 ,在这种自然的存储格式中,要求变量在内存中的位置 必须自然对齐,否则cpu会报告异常。
intel的cpu没有这方面的要求,可以根据情况进行设置,arm的应该也可以,实际上我在arm上也是这样用的,对内存对齐进行自己的设置。
从上面种种消息可以基本推出:
1、字节对齐,可以提高内存查找效率
2、字节对齐的坏处就是:占用内存过多
因此,平衡两点,具体问题具体分析
所谓自然对齐,就是基本数据类型的变量不能简单地存储于内存的任意位置,它们的起始地址必须能够被它们的大小整除。
内存对齐的两种方式
有两种方法:
一是gcc的方式,如下:
#include<stdio.h> struct unpacked_str{ char c; int x; }; struct packed_str{ char c; int x; }__attribute__((packed)); int main() { printf("size of char=%lu\n",sizeof(char)); printf("size of int=%lu\n",sizeof(int)); printf("size of unpacked_str=%lu\n",sizeof(struct unpacked_str)); printf("size of packed_str=%lu\n",sizeof(struct packed_str)); } 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个字节的空间,
这还是小结构体,如果是大结构体,再加上数组的形式,那为了内存对齐,而占用的内存,还是非常大的。
对于嵌入式开发来说,这个还是要特别注意的。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/95550.html