为什么需要内存对齐?

Ash*_*egi 7 c c++ memory pointers memory-alignment

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

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

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

我考虑过它.我认为,如果记忆在奇偶组中,那么理论就适用了.

在此输入图像描述

我错过了什么?

kli*_*eyn 14

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

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

因此,该阅读器可以一次读取整个选定的矩阵行.此行的长度(矩阵列数)定义一次可读取的数据量.例如,如果你有64列,你的内存控制器可以一次读取8个字节(虽然它通常可以做更多).

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

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

正如您可以阅读整行一样,您也可以编写整行.如果您的数据未对齐,当您编写的内容不是完整行时,您将需要执行read-modify-write(读取行的旧内容,修改相关部分并编写新内容).


Eri*_*hil 13

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

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

如果将8或16个对齐位读入寄存器,则导线可以以相同方式传送数据,寄存器中的其他位设置为零.

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

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