如果内存是字节可寻址的,为什么我们有对齐填充?

时间:2011-09-08 08:22:07

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

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

2 个答案:

答案 0 :(得分:3)

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

另见相关的SO问题和答案:

答案 1 :(得分: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。这就是为什么在未对齐的内存中使用填充的原因。