3

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

4

2 回答 2

4

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

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

于 2011-09-08T08:25:04.107 回答
3

取自维基百科

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

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

于 2011-09-08T08:28:32.447 回答