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



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

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

参见相关SO问答:

  • 内存对齐的目的

  • 为什么数据结构对齐对性能很重要?

  • 不对齐的内存访问总是导致总线错误吗?

摘自维基百科:

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

对齐。

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

最新更新