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

gnz*_*lbg 7 c++ arrays c++14

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

    auto array_ptr = std::make_unique<double[]>(size);
    
    Run Code Online (Sandbox Code Playgroud)

    对齐边界(即std要求正确对齐)?sizeof(double) alignof(double)

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

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

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

Ker*_* SB 8

  • 您"正常"获得的所有对象都是适当对齐的,即对齐alignof(T)(不必与其相同sizeof(T).包括动态数组.)(通常,分配器::operator new只返回一个最大对齐的地址,以免不必担心如何使用内存.)

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

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

值得强调的是,对齐实际上并不是一个可以直接在C++中检查的概念,因为指针不是数字.它们可以转换为数字,但转换除了可逆之外通常没有意义.你需要类似于std::align实际说"我已经对齐记忆"的东西,或者只是alignas直接使用你的类型.