一篇文章带你了解C语言内存对齐解决的问题
目录
- 一、内存对齐为4个字节的好处
- 二、内存对齐的目的是以空间换取速度
- 2.1、内存对齐为4的例子
- 2.2、内存没有使用内存对齐的例子
- CPU读取数据的过程:
- 三、掌握内存对齐的必要性
- 总结
一、内存对齐为4个字节的好处 首先,了解一下CPU从内存里读取数据的流程:
第一步,CPU通过地址总线,找到该数据的位置。
第二步,通过控制总线,发送读取数据的指令。
第三步,通过数据总线,从内存里获取该数据的内容。
文章图片
内存对齐使用4个字节的原因有:
1.STM32单片机的数据总线与地址总线都是32bit(4个字节)。
2.方便DMA的搬运,DMA搬运的最大内存是32bit(4个字节)。
二、内存对齐的目的是以空间换取速度
2.1、内存对齐为4的例子
/* 先来一个简单的结构体 */struct{ char a; intb; }Test2;
文章图片
CPU读取内存里数据的过程:
1.想找变量a:第一次读取就能找到。
2.想找变量b:第二次读取就能找到。
这一点很重要,变量a与变量b各自只需要1次寻址就能完成读取。接下来看一看内存如果没有使用内存对齐的例子(当我不知道内存对齐时,我也是误以为内存里的数据是这样分布的!)
2.2、内存没有使用内存对齐的例子
如果内存没有使用内存对齐的话,构想的内存分布如下:
文章图片
CPU读取数据的过程: 1.想找变量a:第一次读取就能找到。
2.想找变量b:先读取第一组内存的后三个字节,接着再读取第二组内存的第一个字节,最后将所有字节合并为4个字节。
如果内存没有使用内存对齐的话,CPU为了获取变量b花掉了两次地址寻址,接着还要将字节合并。所以,内存对齐可以有效地提高CPU读写内存的速度,但是浪费一点空间。
三、掌握内存对齐的必要性 【一篇文章带你了解C语言内存对齐解决的问题】了解内存对齐的作用后,就能弄懂为什么编译器要对某些内存做了填充。比如本章节的例子,如果结构体里只有一个char与int变量,无论是char变量在前,还是int变量在前,都肯定会浪费3个字节被用于填充,凑够4个字节变成一组数据被CPU一次性读取。
总结 本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注脚本之家的更多内容!
推荐阅读
- 宽容谁
- 一个人的旅行,三亚
- 第6.2章(设置属性)
- 布丽吉特,人生绝对的赢家
- 家乡的那条小河
- 讲述,美丽聪明的海欧!
- PMSJ寻平面设计师之现代(Hyundai)
- 夜游宫|夜游宫 心语
- 增长黑客的海盗法则
- 画画吗()