当前位置:首页 > 内存 > 正文

验证内存对齐的存在

  • 内存
  • 2024-06-13 21:31:14
  • 281

一、有经验的C语言程序常说的“内存对齐”,原因究竟是什么

在C语言程序开发中,有经验的程序员有时会提到“内存对齐”这个术语。其实这也是C语言中结构体大小不等于所有结构体大小之和的原因。成员(C语言结构体的大小不等于所有成员的大小之和。为什么?)那么为什么C语言程序需要“内存对齐”呢?

C语言编译器在处理代码时经常会对齐一些变量的内存。这实际上是由于底层处理器的限制造成的。对于大多数处理器来说,每次访问的数据越少越好。例如,有些处理器每次访问4个字节的数据,这比访问1个字节的数据效率要高得多。

针对这种情况,一些C语言编译器会在代码中对齐变量地址,以便处理器能够更高效地访问这些变量。当处理未内存对齐的数据时,即使是最严格的处理器或系统也无法正常运行(总线错误等)。

现代处理器通常具有多级缓存,并且处理器访问这些缓存中的数据比访问内存中的数据效率高得多(处理器访问高速缓存中的数据效率要高得多)如上所述,CPU通常使用字大小(32)。位处理器通常以4字节增量访问数据。如果内存未对齐,CPU在访问数据时可能需要执行更多读取操作。在这些机器上,读取两个字节的数据往往比读取四个字节的数据慢得多。

其实这一部分只是粗浅的讨论。处理器的内存系统要复杂得多,并且涉及的复杂性比此处描述的要复杂得多。但至少我们已经知道,在C语言程序中坚持内存对齐有很多好处。


二、内存对齐规则

接下来我们从一个简单的结构体来分析理解这个规则

根据规则填充结构体struct1,得到需要的内存18。但是,内存分配必须是最大成员8的整数倍,即必须是24。
图1所示的运行结果是我们根据规则计算得到的。

根据上述规则,我们应该输出内存中存储的数据,如图2所示

接下来,我们读取内存区域中的数据,检查是否与我们存储的数据相同。

这里我们使用上面已知的信息结构体struct1作为研究对象。为了验证上述规则,将另一个结构体struct2定义为struct1的成员。

根据规则,struct2的最大内部成员是1字节的整数倍。填充存储。无需更改struct1所需的内存。
结果图2.1

从结果图来看,struct2的成员被填充并存储在struct1的成员d之后。

结果图2.2

struct1所需内存变为28。8字节的最大整数倍应为32。

结构体struct2被填充到29并结束,但该结构体需要满足内存对齐原则。因此,其扩展(30,31)总共容纳12个字节,这是其最大成员的整数倍,因此Short从32开始填充。内存为40字节。

您可能会发现结体成员的顺序已被调整,以利用中间多余的部分。这节省了结构所需的内存。

上一篇:内存对齐原理

下一篇:内存对齐问题