繁体   English   中英

C ++内存对齐

[英]C++ 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

但是实际上,这些变量不遵循“自然对齐”规则,一个16字节的变量驻留在以0xC结尾的内存地址中。 为什么是这样 ?

自然内存对齐通常是指单个变量的对齐,而不是变量数组的对齐。 因此,由4个字节的整数组成的数组(如上所示)自然对齐到4个字节的边界,而不是16个字节的边界。

自然内存对齐通常与CPU的加载/存储指令的结构和实现方式有关,而与缓存行的大小无关。 CPU不会一次加载整个阵列(矢量加载除外)。 因此,CPU并不真正在乎它加载的整数是否是数组的一部分。

同时加载小型阵列的矢量加载通常确实有更严格的对齐要求。 例如,为了在x86上进行对齐的矢量加载,该项必须对齐到16个字节。

C ++不会在缓存行上对齐任何内容,因为出于所有意图和目的,它都不知道有缓存。

如果您希望某些东西在16字节边界上对齐,请尝试使用posix_memalign()来处理堆上的内容,或者(如果使用GCC)在堆栈上,请使用int x __attribute__ ((aligned (16))) 在C ++ 11中,有alignas说明符

我不知道如何以保证对齐的方式调用new()

无法保证对齐

根据《英特尔®64和IA-32架构优化参考手册》(B.4.5.2辅助部分),

跨越两页的32字节AVX存储指令需要大约150个周期的协助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM