C++ 是否标准::使_独一无二<;T[]>;需要返回对齐的内存吗?

C++ 是否标准::使_独一无二<;T[]>;需要返回对齐的内存吗?,c++,arrays,c++14,C++,Arrays,C++14,唯一指针数组\u ptr拥有的内存: auto array_ptr = std::make_unique<double[]>(size); auto array_ptr=std::make_unique(大小); 与sizeof(double)alignof(double)边界对齐(即标准是否要求正确对齐) 数组的第一个元素是缓存线的第一个元素吗 否则:在C++14中实现这一点的正确方法是什么 动机(更新):我计划在阵列上使用SIMD指令,因为缓存线是我所知道的每个体系结构上的

唯一指针
数组\u ptr
拥有的内存:

auto array_ptr = std::make_unique<double[]>(size);
auto array_ptr=std::make_unique(大小);
sizeof(double)
alignof(double)
边界对齐(即标准是否要求正确对齐)

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

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

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

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

    • <> > C++中没有缓存行。这是一个需要处理的平台特定问题(但是Alcasas)可能有帮助。


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


    值得强调的是,对齐不是一个可以直接在C++中检查的概念,因为指针不是数字。它们可以转换成数字,但是转换不是一般意义上的,而是可逆的。你需要一些东西,比如代码> STD::Algun,实际上说“我有对齐内存”。,或者直接在类型上使用
    alignas

    “您并不真正关心数据是否位于缓存线的开头,只关心没有两个数据元素位于同一缓存线上。”例如,错误共享是正确的。但是我想在数组中使用SIMD指令,我不知道第一个元素在缓存行的中间随机启动的效果。@ GNZLBG:这是一个非常不同的问题!如果我的数据被适当地对齐,即使第一个元素不在缓存行的开头,它仍然可以工作。由于缓存线是我所知道的每种体系结构中的基本内存单元,我宁愿“做得正确”,并将我的第一个元素放在第一个元素的开头。您能否演示如何对一个双精度数组进行唯一的\u ptr静态检查,或者如何直接使用alignas?(或者只是在其他地方给我举一个这样的例子?)。听起来你是从问题X开始的,现在我们是问题Y。一个新的问题可能会得到一些新的答案。听起来你想要的是对齐的存储而不是对齐的类型。类型总是至少和对齐的大小一样大,这根本不是你想要的。也许可以试试
    std::aligned_storage
    @KerrekSB我想对齐的存储这就是我说对齐内存时的意思。很抱歉,sizeof与alignof之间的混淆(我不知道alignof)。