内存是否由唯一指针array_ptr
拥有:
auto array_ptr = std::make_unique<double[]>(size);
与 sizeof(double)
alignof(double)
边界对齐(即std是否需要正确对齐)?
数组的第一个元素是缓存行的第一个元素吗?
否则:在C ++ 14中实现这个目的的正确方法是什么?
动机(更新):我计划在阵列上使用SIMD指令,因为高速缓存行是每个架构上的基本内存单元,我知道我只是正确地分配内存,这样第一个元素数组的位于缓存行的开头。请注意,只要元素正确对齐(与高速缓存行之间元素的位置无关),SIMD指令就可以工作。但是,我不知道这是否会产生影响,但我可以猜测是的,确实如此。此外,我想在内核中的原始内存上使用这些SIMD指令。这是内核的优化细节,所以我不想分配,例如__int128而不是int。
答案 0 :(得分:7)
“正常”获得的所有对象都是适当对齐的,即在alignof(T)
处对齐(不需要与sizeof(T)
相同。这包括动态数组。(通常,分配器) ::operator new
将返回一个最大对齐的地址,以免不必担心内存的使用方式。)
C ++中没有缓存行。这是您需要自己处理的特定于平台的问题(但alignas
可能有所帮助)。
尝试alignas
加上静态检查是否有效(因为对过度对齐类型的支持取决于平台),否则只需添加手动填充。您并不关心数据是否位于缓存行的开头,只是没有两个数据元素位于同一缓存行中。
值得强调的是,对齐实际上并不是一个可以直接在C ++中检查的概念,因为指针不是数字。它们可转换到数字,但转换除了可逆之外通常没有意义。您需要std::align
之类的内容来实际说出“我已对齐内存”,或者直接在您的类型上使用alignas
。