C++内存对齐

Stu*_*123 5 c++ memory-management memory-alignment

所以我读到当变量在c ++中声明时,如果你想获得最佳的缓存读取,那么内存应该坚持其自然对齐.例:

int a; // memory address should end in 0x0,0x4,0x8,0xC
int b[2]; // 8 bytes 0x0,0x8
int b[4]; // 16 bytes 0x0
Run Code Online (Sandbox Code Playgroud)

但实际上这些变量并不遵循"自然对齐"规则,16字节变量驻留在以0xC结尾的存储器地址中.为什么是这样 ?

Cra*_*son 5

自然记忆对齐通常是指各个变量的对齐,而不是变量数组.因此,4字节整数的数组(如上所示)自然地与4字节边界对齐,而不是与16字节边界对齐.

自然内存对齐通常与CPU的加载/存储指令的架构和实现有关,而不是缓存行的大小.CPU不会一次加载整个数组(向量加载除外).因此,CPU并不关心它加载的整数是否是数组的一部分.

矢量加载同时加载小数组,通常会有更严格的对齐要求.例如,为了在x86上执行对齐向量加载,项必须对齐到16个字节.