C语言 | 内存对齐02 - 为什么会有内存对齐?它解决了什么问题

一、前言


内存对齐的目的是为了提高CPU读写内存里数据的速度。现代的CPU读取内存并不是一个一个字节挨着读取,这样做的效率非常低。现代的CPU一般以4个字节(32bit数据总线)或者8个字节(64bit数据总线)为一组,一组一组地读写内存里的数据。

二、内存对齐为4个字节的好处


首先,了解一下CPU从内存里读取数据的流程:
第一步,CPU通过地址总线,找到该数据的位置。
第二步,通过控制总线,发送读取数据的指令。
第三步,通过数据总线,从内存里获取该数据的内容。
在这里插入图片描述
内存对齐使用4个字节的原因有:

  1. STM32单片机的数据总线与地址总线都是32bit(4个字节)。
  2. 方便DMA的搬运,DMA搬运的最大内存是32bit(4个字节)。

三、内存对齐的目的是以空间换取速度


3.1、内存对齐为4的例子

/* 先来一个简单的结构体 */
struct
{
	char a;
    int  b;

}Test2;

在这里插入图片描述
CPU读取内存里数据的过程:

  1. 想找变量a:第一次读取就能找到。
  2. 想找变量b:第二次读取就能找到。
    这一点很重要,变量a与变量b各自只需要1次寻址就能完成读取。接下来看一看内存如果没有使用内存对齐的例子(当我不知道内存对齐时,我也是误以为内存里的数据是这样分布的!)

3.2、内存没有使用内存对齐的例子

如果内存没有使用内存对齐的话,构想的内存分布如下:
在这里插入图片描述
CPU读取数据的过程:

  1. 想找变量a:第一次读取就能找到。
  2. 想找变量b:先读取第一组内存的后三个字节,接着再读取第二组内存的第一个字节,最后将所有字节合并为4个字节。

如果内存没有使用内存对齐的话,CPU为了获取变量b花掉了两次地址寻址,接着还要将字节合并。所以,内存对齐可以有效地提高CPU读写内存的速度,但是浪费一点空间。

四、掌握内存对齐的必要性


了解内存对齐的作用后,就能弄懂为什么编译器要对某些内存做了填充。比如本章节的例子,如果结构体里只有一个char与int变量,无论是char变量在前,还是int变量在前,都肯定会浪费3个字节被用于填充,凑够4个字节变成一组数据被CPU一次性读取。
不过,当掌握内存对齐的知识点后,上一章节的例子就能避免更多的内存被浪费了。C语言 | 内存对齐01 - 什么是内存对齐

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wallace Zhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值