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

Is std::make_unique<T[]> required to return aligned memory?

本文关键字:gt 返回 对齐 内存 make unique 是否 lt std      更新时间:2023-10-16
  • 是唯一指针array_ptr:所拥有的内存吗

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

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

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

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

动机(更新(:我计划在阵列上使用SIMD指令,由于缓存线是我所知的每一个体系结构上的基本内存单元,我宁愿正确分配内存,使阵列的第一个元素位于缓存线的开头。请注意,只要元素正确对齐(与缓存行之间元素的位置无关(,SIMD指令就可以工作。然而,我不知道这是否有影响,但我猜是的,确实有。此外,我想在内核内的原始内存上使用这些SIMD指令。这是内核的优化细节,所以我不想分配例如__int128而不是int。

  • 你"正常"获得的所有对象都是适当对齐的,即在alignof(T)对齐(不需要与sizeof(T)相同。这包括动态数组。(通常,分配器::operator new只会返回一个最大对齐的地址,这样就不必担心如何使用内存了。(

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

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

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