13、深入理解计算机系统 P189 数据对齐
1、怎么理解"要求某种类 型对象的地 址必须是某个值 K (通常是 2 、 4 或 8 ) 的倍数 。"?
假设我们有一个 32 位的计算机体系结构,那么通常情况下,这个体系结构要求数据在内存中的存储地址是 4 的倍数。这意味着,对于一个 32 位整数(4 个字节),它的起始地址必须是 4、8、12、16 等等。对于一个 64 位的计算机体系结构,数据对齐要求可能是 8 的倍数,因此一个 64 位的整数(8 个字节)的起始地址必须是 8、16、24 等等。
当处理器从内存中读取数据或写入数据时,通常会按照一定的块大小进行操作。假设处理器每次读取或写入的数据大小是 8 个字节(64 位),这个块的大小称为处理器的“字(word)”大小。然而,为了确保高效的内存访问,这些操作要求数据在内存中的存储地址满足一定的对齐要求。
-
数据对齐的情况: 如果数据的起始地址是块大小的倍数(例如 8 的倍数),那么在读取或写入一个数据时,处理器可以通过一次内存操作就完成,因为数据正好位于一个块内。这样的数据访问更高效。
-
数据未对齐的情况: 如果数据的起始地址不是块大小的倍数,那么数据可能跨越多个块。在这种情况下,处理器需要执行多次内存操作才能获取完整的数据,因为它必须在两个块之间进行多次访问。这种情况下,数据访问的效率较低,会增加内存访问的开销和延迟。
例如,假设我们有一个 double
类型的数据,它占用 8 个字节。如果处理器的字大小是 8 字节,那么当我们从内存中读取或写入一个 double
数据时,最理想的情况是这个数据的起始地址正好是 8 的倍数。这样,处理器可以通过一次内存操作就将整个 double
数据加载到寄存器中,从而更高效地执行计算。
如果数据的起始地址不是 8 的倍数,而是落在两个 8 字节块之间,那么处理器可能需要执行两次内存操作才能获取完整的 double
数据,增加了访问的开销和时间。