内存对齐对性能的影响
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
//一个结构体的定义如下
struct S
{
int8 a;
int32 b;
}
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
int8 a | int32 b | int32 b | int32 b | int32 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次。
如果内存没有对齐时
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
int8 a | int32 b | int32 b | int32 b | int32 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 “内存对齐对程序性能的影响”