algorithm - 理解单词对齐

标签 algorithm hardware theory cpu-architecture

我理解对齐访问内存意味着什么,但我不明白为什么这是必要的。例如,为什么我可以从地址 0x…1 访问单个字节?但我无法从同一地址访问半字(两个字节)。

同样,我知道如果你有一个地址 A和一个大小为 s 的对象如果A mod s = 0,访问是对齐的.但我只是不明白为什么这在硬件层面很重要。

最佳答案

硬件很复杂;这是一个简化的解释。

典型的现代计算机可能具有 32 位数据总线。这意味着 CPU 需要执行的任何提取操作都将提取特定内存地址的所有 32 位。由于数据总线不能获取任何小于 32 位的数据,地址总线上什至没有使用最低的两个地址位,所以就好像 RAM 被组织成一个 32 位的字序列 而不是 8 位字节

当 CPU 获取单个字节时,总线上的读取周期将获取 32 位,然后 CPU 将丢弃其中的 24 位,将剩余的 8 位加载到任何寄存器中。如果 CPU 想要获取一个 在 32 位边界上对齐的 32 位值,它有几个一般选择:

  • 在总线上执行两个独立的读取周期以加载数据字的适当部分并重新组合它们
  • 在丢弃地址低两位确定的地址处读取32位字
  • 读取一些组装成 32 位字的意想不到的字节组合,可能不是您想要的
  • 抛出异常

我使用过的各种 CPU 都采用了所有这四种路径。通常,为了获得最大兼容性,将所有 n 位读取对​​齐到 n 位边界是最安全的。但是,如果您确定您的软件将在具有已知未对齐读取行为的某些特定 CPU 系列上运行,那么您当然可以走捷径。即使可以进行未对齐读取(例如在 x86 系列 CPU 上),它们也会变慢。

关于algorithm - 理解单词对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29842375/

相关文章:

将一组偏好与单个结果相匹配的算法?

c# - LINQ 知道如何优化 "queries"吗?

c# - 内核与我可以生成的线程数之间的关系

c# - 将 Assert.That(而不是 Assume.That)与 [Theory] ​​一起使用是错误的吗?

php - 通过 URL 指定 Controller 类与为每个 Controller 都有一个脚本的优缺点是什么?

C:如何读取多个字符串片段并打印 #of 片段和 #of 字符

c++ - 故障跟踪递归函数

c++ - 6510/C64 Simulator in C++,如何实现Cycle/Clock

java - 编写高效的 Java 代码是否需要深入了解底层?

parsing - 形式语法权力的实际后果?