我了解到在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
但是在实践中,这些变量并不遵循“自然对齐”规则,一个16字节的变量存储在以0xC结尾的内存地址,为什么会这样呢?
我了解到在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
但是在实践中,这些变量并不遵循“自然对齐”规则,一个16字节的变量存储在以0xC结尾的内存地址,为什么会这样呢?
_aligned_malloc
来为数组和对象获取对齐内存。 - user276648posix_memalign()
,或者(如果使用GCC)在栈上使用int x __attribute__ ((aligned (16)))
。在C++11中,有alignas specifier。但我不知道如何使用new()
调用具有保证对齐的函数。operator new()
并强制对齐。 - Glenn Teitelbaum无法保证对齐