它不会降低性能并在电路中产生很多复杂性。
正是我们认为是事实的错误假设真正阻碍了进一步的理解。
您在另一个问题中的评论使用了更合适的措辞(“我认为它不会降级”......)
您是否考虑过内存架构并行使用许多内存芯片以最大化带宽?并且特定数据项仅在一个芯片中,您不能只读取最方便的芯片并期望它具有您想要的数据。
现在,CPU 和内存可以连接在一起,这样位 0-7 仅连接到芯片 0、8-15 连接到芯片 1、16-23 连接到芯片 2、24-31 连接到芯片 3。对于所有整数 N ,内存位置 4N 存储在芯片 0 中,4N+1 存储在芯片 1 中,等等。它是每个芯片中的第 N 个字节。
我们来看看每个内存芯片的每个偏移处存储的内存地址
内存芯片 0 1 2 3
抵消
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
N 4N 4N+1 4N+2 4N+3
因此,如果您从内存字节 0-3 加载,N=0,每个芯片都会报告其内部字节 0,这些位最终都在正确的位置,一切都很好。
现在,如果您尝试从内存位置 1 开始加载一个单词,会发生什么?
首先,我们看看它的完成方式。第一个内存字节 1-3,存储在内存芯片 1-3 的偏移量 0 中,最终在位 8-31,因为这是连接这些内存芯片的位置,即使您要求它们位于位 0-23 中。这没什么大不了的,因为 CPU 可以在内部调整它们,使用用于逻辑左移的相同电路。然后在下一个事务中,存储在内存芯片 0 中偏移量 1 处的内存字节 4 被读入位 0-7 并混合到您想要的位 24-31 中。
注意这里的一些东西。您要求的单词是跨偏移量拆分的,第一个内存事务从三个芯片的偏移量 0 读取,第二个内存事务从另一个芯片的偏移量 1 读取。这就是问题所在。您必须告诉内存芯片偏移量,以便它们可以将正确的数据发回给您,偏移量约为 40 位宽,信号速度非常快。现在只有一组偏移信号连接到所有内存芯片,要为未对齐的内存访问执行单个事务,您需要运行到每个内存芯片的独立偏移(称为地址总线 BTW)。对于 64 位处理器,您将从 1 个地址总线更改为 8 个,增加了近 300 个引脚。在 CPU 使用 700 到 1300 个引脚的世界中,这几乎不能称为“
好吧,这并没有那么糟糕,因为地址总线上一次最多只能有两个不同的偏移量,而且一个总是另一个加一个。因此,您可以在每个内存芯片上使用一根额外的电线,实际上是(读取地址总线上列出的偏移量)或(读取下面的偏移量)这是两种状态。但是现在每个内存芯片中都有一个额外的加法器,这意味着它必须在实际进行内存访问之前计算偏移量,这会降低内存的最大时钟速率。这意味着如果您希望非对齐访问更快,对齐访问会变慢。由于 99.99% 的访问可以对齐,因此这是净损失。
所以这就是为什么非对齐访问被分成两个步骤。因为地址总线由所有涉及的字节共享。这实际上是一种简化,因为当你有不同的偏移量时,你也会涉及不同的缓存线,所以所有的缓存一致性逻辑都必须加倍来处理 CPU 内核之间的两倍通信。