内存对齐

内存对齐

CPU读取内存的方式

CPU读取内存的方式其实非常复杂,为了更进一步的了解相关的原理,需要对计算机组成原理进行深度学习。

Memory access granularity(内存读取粒度)

However, your computer’s processor does not read from and write to memory in byte-sized chunks. Instead, it accesses memory in two-, four-, eight- 16- or even 32-byte chunks. We’ll call the size in which a processor accesses memory its memory access granularity.

CPU把内存当成是一块一块的,块的大小可以是2,4,8,16字节大小,因此CPU在读取内存时是一块一块进行读取的。块大小成为memory access granularity(粒度) 本人把它翻译为“内存读取粒度” 。

https://www.cnblogs.com/feng9exe/p/10059543.html ”内存对齐“

内存对齐举例

假设此计算机的内存读取粒度是4。

如果内存对齐时

前提知识:

1 Byte = 8bit

1 int8 占用 1 Byte

1 int16 占用 2 Byte

1 int32 占用 4 Byte

1
2
3
4
5
6
//一个结构体的定义如下
struct S
{
int8 a;
int32 b;
}
0123456789101112131415
int8 aint32 bint32 bint32 bint32 b

我们可以发现int8 a储存在0号内存上,占用1个Byte,1-3号内存空下了3个Byte。int32 b储存在了4-7号内存,一共4个Byte。

由于此计算机的内存读取粒度时是4

当需要读取a(0号内存)时,计算机会读取0-3号一组内存,然后去掉1-3号内存。访问次数1次。

当需要读取b(4-7号内存时),计算机会读取4-7号内存,访问次数1次。

如果内存没有对齐时

0123456789101112131415
int8 aint32 bint32 bint32 bint32 b

我们可以发现int8 a储存在0号内存上,占用了1个Byte。int32 b储存在1-4号内存上,一共4个Byte。

由于此计算机的内存读取粒度时是4

当需要读取a(0号内存)时,计算机会读取0-3号一组内存,然后去掉1-3号内存。访问次数1次。

当需要读取b(1-4号内存)时,计算机会先读取0-3号一组内存,去掉0号内存,再读取4-7号一组内存,去掉5-7号内存,随后再拼接1-3号内存和4号内存组成完整的b。访问次数2次。

内存对齐的目的

合理的内存对齐可以高效的利用硬件性能,减少处理器内存访问次数。

相关链接

https://www.bilibili.com/video/BV1Vt4y1m7DP?from=search&seid=13964421962700904405&spm_id_from=333.337.0.0 “内存对齐”

https://www.bilibili.com/video/BV1v64y1X7YP?spm_id_from=333.999.0.0 “内存对齐对程序性能的影响”


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!