【问题标题】:Why do we have alignment padding if memory is byte-addressable?如果内存是字节可寻址的,为什么我们有对齐填充?
【发布时间】:2011-09-08 08:22:07
【问题描述】:

既然我们可以单独处理内存的每个字节,为什么编译器要特别注意确保结构及其成员与内存中的 32 位边界对齐? 我在这里可能错了,但是在 32 位系统上,从 0x0800 开始获取 4 个字节的速度与从 0x0801 开始的速度一样快吗?

【问题讨论】:

标签: compiler-construction memory-management memory-alignment


【解决方案1】:

在大多数架构上,对自然对齐的数据类型执行读/写会更快。在 一些 系统上,如果您在某些类型未对齐时尝试访问它们,它将产生异常(即在大多数情况下崩溃)。所以一般来说,除非你有充分的理由不这样做,否则你总是希望保持自然对齐。

另请参阅相关的 SO 问题和答案:

【讨论】:

    【解决方案2】:

    取自wikipedia:

    例如,当计算机的字长为 4 字节(一个字节表示 8 位)时,要读取的数据应该位于 4 的某个倍数的内存偏移处。如果不是这种情况,例如数据从第 14 个字节而不是第 16 个字节开始,然后计算机必须读取两个 4 字节块并在读取请求的数据之前进行一些计算,否则可能会产生对齐错误。即使前一个数据结构在第 14 个字节结束,下一个数据结构也应该从第 16 个字节开始。在两个数据结构之间插入两个填充字节,将下一个数据结构对齐到第 16 个字节

    内存必须是multiple of 4 bytes 才能更快地访问,而reduce computation 必须是better performance。 因此,如果内存在大多数情况下通常是 4 字节块的地址字节可寻址,那么我们知道下一个地址将从哪里开始,例如如上所述,如果您最终得到14 bytes(应该是 16 字节 4*4 = 16),那么您知道必须使用多少填充 16-14 = 2 bytes padding。这就是为什么在未对齐的内存中使用填充。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      • 1970-01-01
      • 2019-11-05
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多