Memory 内存对齐的目的

Memory 内存对齐的目的,memory,alignment,memory-alignment,Memory,Alignment,Memory Alignment,诚然,我不明白。假设您有一个长度为1字节的内存字。为什么不能在未对齐的地址(即不能被4整除)上的单个内存访问中访问4字节长的变量,就像对齐的地址一样?这是许多底层处理器的限制。通常可以通过执行4次低效的单字节抓取而不是一次高效的字抓取来解决这个问题,但是许多语言说明符认为,将它们取缔并强制所有内容对齐会更容易 OP发现了更多信息。在PowerPC上,您可以从奇数地址加载整数,而不会出现任何问题 Sparc和I86以及(我认为)iTanium在您尝试此操作时会引发硬件异常 在大多数现代处理器上,一

诚然,我不明白。假设您有一个长度为1字节的内存字。为什么不能在未对齐的地址(即不能被4整除)上的单个内存访问中访问4字节长的变量,就像对齐的地址一样?

这是许多底层处理器的限制。通常可以通过执行4次低效的单字节抓取而不是一次高效的字抓取来解决这个问题,但是许多语言说明符认为,将它们取缔并强制所有内容对齐会更容易


OP发现了更多信息。

在PowerPC上,您可以从奇数地址加载整数,而不会出现任何问题

Sparc和I86以及(我认为)iTanium在您尝试此操作时会引发硬件异常


在大多数现代处理器上,一个32位负载与四个8位负载不会有太大区别。数据是否已经在缓存中将产生更大的影响

您可以使用某些处理器(),但以前所有的内存访问都是在64位(或32位)线路上对齐的,因为总线是64位宽的,您必须一次获取64位,而且以64位的对齐“块”获取这些内存要容易得多

所以,如果你想得到一个字节,你可以获取64位的块,然后屏蔽掉你不想要的位。如果你的字节位于正确的一端,简单快捷,但是如果它位于64位块的中间,你就必须屏蔽掉不需要的位,然后把数据移到正确的位置。更糟糕的是,如果您想要一个2字节的变量,但它被分割成2个块,那么这需要两倍的内存访问


因此,由于每个人都认为内存很便宜,他们只是让编译器根据处理器的块大小对齐数据,这样代码就可以更快、更高效地运行,而不会浪费内存。

现代处理器上的内存子系统仅限于以字大小的粒度和对齐方式访问内存;这种情况有很多原因

速度 现代处理器具有多级缓存,数据必须通过这些缓存;支持单字节读取将使内存子系统吞吐量与执行单元吞吐量紧密绑定(又称cpu绑定);这一切都让人想起硬盘中有多少相同的原因

CPU总是以其字大小(32位处理器上为4字节)读取数据,因此当您在支持它的处理器上执行未对齐地址访问时,处理器将读取多个字。CPU将读取您请求的地址跨越的每个内存字。这将导致访问请求数据所需的内存事务数最多放大2倍

因此,读取两个字节比读取四个字节要慢得多。例如,假设内存中有一个结构,如下所示:

struct mystruct {
    char c;  // one byte
    int i;   // four bytes
    short s; // two bytes
}
在32位处理器上,它最有可能按照如下所示对齐:

处理器可以在一个事务中读取每个成员

假设你有一个压缩版本的struct,可能是从网络上为了传输效率而打包的;它可能看起来像这样:

struct mystruct {
    char c;  // one byte
    int i;   // four bytes
    short s; // two bytes
}

读取第一个字节将是相同的

当您要求处理器从0x0005中为您提供16位时,它必须从0x0004中读取一个字,并左移1字节以将其放入16位寄存器中;一些额外的工作,但大多数可以在一个周期内完成

当您从0x0001请求32位时,您将得到2倍的放大。处理器将从0x0000读入结果寄存器并向左移位1个字节,然后再次从0x0004读入临时寄存器,向右移位3个字节,然后将其与结果寄存器一起使用

范围 对于任何给定的地址空间,如果体系结构可以假设2个LSB始终为0(例如,32位机器),那么它可以访问4倍多的内存(2个保存的位可以表示4个不同的状态),或者使用2个位访问相同数量的内存,例如标志。从一个地址中去掉2个LSB将得到一个4字节的对齐方式;也被称为4字节的数组。每次地址递增时,它实际上递增的是位2,而不是位0,即最后2位将始终是
00

这甚至会影响系统的物理设计。如果地址总线需要少2个位,CPU上可以少2个引脚,电路板上可以少2个记录道

原子性 CPU可以原子地对对齐的内存字进行操作,这意味着没有其他指令可以中断该操作。这对于许多范例和其他范例的正确操作至关重要

结论 处理器的存储系统比这里描述的要复杂得多,也要复杂得多;关于的讨论可能会有所帮助(许多处理器的工作方式类似)

坚持内存对齐还有很多好处,您可以从中阅读

计算机的主要用途是转换数据。现代内存体系结构和技术经过几十年的优化,以便于以高度可靠的方式在更多更快的执行单元之间获取更多数据

奖励:缓存 我前面提到的另一个性能调整是缓存线上的调整(例如,在某些CPU上)64B

有关利用缓存可以获得多少性能的更多信息,请参阅;由此

对缓存线的理解对于某些类型的程序优化非常重要。例如,数据对齐可以确定操作是接触一条缓存线还是两条缓存线。正如我们在上面的示例中所看到的,这很容易意味着在未对齐的情况下,操作将慢两倍


从根本上说,原因是内存总线具有比内存大小小得多的特定长度

那么,第