x86架构下结构体内存对齐与缓存行读取规则相关问题咨询
缓存行加载规则
- x86架构下,CPU将内存数据加载到缓存时,确实会以缓存行大小为单位对齐读取,你当前环境缓存行是64字节,所以每次加载的起始地址一定是64的整数倍,地址范围是
n*64 ~ (n+1)*64 -1,和你举的0x000x3F、0x400x7F的例子完全一致。 - 即使你仅访问0x20地址处的4字节
int32_t数据,CPU也会完整加载0x00~0x3F的全部64字节内容到缓存中,这是缓存利用空间局部性提升性能的标准设计。
内存排布规则
首先先计算struct Obj的大小:
结构体的对齐规则要求整体地址必须按其内部最大基本类型成员的大小对齐,这里最大成员是8字节的int64_t,所以:
int64_t a[5]占 5*8=40 字节char b[2]占2字节- 末尾需填充6字节的对齐保留位,整个结构体总大小为48字节,对齐到8字节边界。
关于你提到的变量排布问题:
虚拟内存层面
- 如果
c、obj、d是栈上的局部变量:x86架构Linux的栈是从高地址向低地址增长的,编译器分配栈空间的顺序和变量声明顺序相反,且编译优化开启时还可能调整变量顺序、优化掉未使用的变量,不可能严格按照你声明的顺序连续排布。 - 如果是全局或静态存储变量:编译器会将其分配到数据段,但同样会做对齐处理,也可能调整变量顺序优化缓存利用率,不会保证和你写的声明顺序完全连续排列。
物理内存层面
虚拟地址和物理地址以内存页(通常为4KB)为单位通过页表映射,即使虚拟地址是连续的一段空间,对应的物理页也完全可能是离散分布的,和虚拟地址排布没有直接对应关系。
综上,你给出的内存排布示意图的情况,无论在虚拟内存还是物理内存层面都不会出现。
内容的提问来源于stack exchange,提问作者Ryan Gao
相关产品推荐
相关产品推荐

