7

可能重复:
内存对齐的目的

我在网上阅读了一些关于内存对齐的文章,并且可以理解从正确对齐的内存(采用 2 字节对齐)我们可以一次快速地获取数据。

但是,如果我们有像单个硬件一样的内存,那么给定一个地址,为什么我们不能直接从那个位置读取 2 个字节。喜欢:在此处输入图像描述

我想了想。我认为如果内存在奇偶组中,那么该理论将适用。

在此处输入图像描述

我错过了什么?

4

3 回答 3

14

来自内存的数据通常通过一组与总线宽度匹配的线路传送到处理器。例如,如果总线为 32 位宽,则有 32 条数据线从总线进入处理器(以及用于控制信号的其他线)。

在处理器内部,各种电线和开关将这些数据传送到需要的地方。如果您将 32 位对齐的位读入寄存器,则线路可以非常直接地将数据传送到寄存器(或其他保存位置)。

如果您将 8 或 16 个对齐的位读入寄存器,则线路可以以相同的方式传递数据,并且寄存器中的其他位设置为零。

如果将 8 或 16 个未对齐的位读入寄存器,则线路无法直接传递数据。相反,这些位必须被移动:它们必须通过一组不同的线,以便它们可以“移动”以与进入寄存器的线对齐。

在某些处理器中,设计人员已经放置了额外的电线和开关来实现这一移动。就所需的硅量而言,这可能非常昂贵。您需要大量额外的电线和开关才能将任何可能的未对齐字节移动到所需位置。因为这非常昂贵,所以在某些处理器中,没有一个完整的移位器可以立即完成所有移位。相反,移位器可能只能在每个 CPU 周期移动一个字节左右,并且需要几个周期才能移动几个字节。在某些处理器中,根本就没有连接线,因此所有的加载和存储都必须对齐。

于 2012-10-14T11:14:58.747 回答
14

您的图片描述了我们(人类)如何可视化计算机内存。

实际上,将内存视为巨大的位矩阵。每个矩阵列都有一个附加的“读取器”,可以从该列读取/写入任何位。每个矩阵行都有一个“选择器”,可以选择阅读器将读取/写入的特定位。

因此,该阅读器可以一次读取整个选定的矩阵行。该行的长度(矩阵列数)定义了一次可以读取多少数据。例如,如果您有 64 列,那么您的内存控制器可以一次读取 8 个字节(尽管它通常可以做更多的事情)。

只要您保持数据对齐,您将需要更少的这些内存访问。即使您只需要读取两位,但它们位于不同的行上,您也需要两次访问内存而不是一次。

此外,还有一个整体的写作方面,这是一个不同的问题。

就像你可以读整行一样,你也可以写整行。如果你的数据没有对齐,当你写的东西不是整行时,你需要做读-修改-写(读取行的旧内容,修改相关部分并写入新内容)。

于 2012-10-14T10:22:40.607 回答
4

在第一种情况下(单个硬件),如果您需要读取 2 个字节,那么处理器将不得不发出两个读取周期,这是因为内存是字节可寻址的,即每个字节都提供一个唯一的地址。

将内存组织为存储体有助于 CPU 在单个读取周期内将更多数据提取到寄存器中。这种技术有助于减少读取周期——与 CPU 的处理能力相比,这是一个非常缓慢的过程。因此,对于单个读取周期,您可以读取更多数据。

于 2012-10-14T10:14:20.550 回答