是否需要std :: make_unique <t []>才能返回对齐的内存?</t []>

时间:2014-05-19 08:43:37

标签: c++ arrays c++14

  • 内存是否由唯一指针array_ptr拥有:

    auto array_ptr = std::make_unique<double[]>(size);
    

    sizeof(double) alignof(double)边界对齐(即std是否需要正确对齐)?

  • 数组的第一个元素是缓存行的第一个元素吗?

  • 否则:在C ++ 14中实现这个目的的正确方法是什么?

动机(更新):我计划在阵列上使用SIMD指令,因为高速缓存行是每个架构上的基本内存单元,我知道我只是正确地分配内存,这样第一个元素数组的位于缓存行的开头。请注意,只要元素正确对齐(与高速缓存行之间元素的位置无关),SIMD指令就可以工作。但是,我不知道这是否会产生影响,但我可以猜测是的,确实如此。此外,我想在内核中的原始内存上使用这些SIMD指令。这是内核的优化细节,所以我不想分配,例如__int128而不是int。

1 个答案:

答案 0 :(得分:7)

  • “正常”获得的所有对象都是适当对齐的,即在alignof(T)处对齐(不需要与sizeof(T)相同。这包括动态数组。(通常,分配器) ::operator new将返回一个最大对齐的地址,以免不必担心内存的使用方式。)

  • C ++中没有缓存行。这是您需要自己处理的特定于平台的问题(但alignas可能有所帮助)。

  • 尝试alignas加上静态检查是否有效(因为对过度对齐类型的支持取决于平台),否则只需添加手动填充。您并不关心数据是否位于缓存行的开头,只是没有两个数据元素位于同一缓存行中。

值得强调的是,对齐实际上并不是一个可以直接在C ++中检查的概念,因为指针不是数字。它们可转换到数字,但转换除了可逆之外通常没有意义。您需要std::align之类的内容来实际说出“我已对齐内存”,或者直接在您的类型上使用alignas