go内存对齐详解

122 阅读1分钟

内存对齐是为了让cpu能够更快的从内存中读取数据,为什么对齐后能更快?因为对齐后cpu取数据时,不需要额外的读操作,为什么不需要额外读?

因为cpu读取数据是通过地址总线将地址传输给内存,内存再通过数据总线将数据返回给cpu,像32位系统指的就是地址总线是32条,32种0或者1代表能表示2^32个地址,但细想一下,一个地址不应该只对应一个位置,也就是1个bit吗?实际上,一个地址对应了硬件上的多个位置,如下图所示,一个内存条上有4个芯片,这4个芯片是并行的对应着一个地址的,如果存入一个数据,该数据是会被分散的存储在这四个芯片上的,每个芯片上有8个bank,这8个bank也对应着这一个地址。也就是说一个地址,对应着4 * 8=32个bit位,那么,对一个地址的一次读操作能读取4个字节的数据,如果内存没对齐,第一个数据3个字节插入,第二个数据2个字节插入,那么这2个字节的数据正好是在4 ~ 5字节的位置,这个数据将会被存在不同的总线地址上,读取该数据将会需要读取两次。如果采用内存对齐,第二个数据放在5 ~ 6的位置,只需要读取一次就能得到数据。

image.png

image.png