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)
边界对齐(即标准是否要求正确对齐)
- “正常”获得的所有对象都是适当对齐的,即在
处对齐(不需要与alignof(T)
相同,其中包括动态数组。(通常,分配器sizeof(T)
只返回一个最大对齐的地址,这样就不必担心内存的使用方式。)::operator new
<> > C++中没有缓存行。这是一个需要处理的平台特定问题(但是 - 尝试
加上静态检查是否有效(因为对过度对齐类型的支持取决于平台),否则只需添加手动填充即可。您并不真正关心数据是否位于缓存线的开头,只关心没有两个数据元素位于同一缓存线上alignas
值得强调的是,对齐不是一个可以直接在C++中检查的概念,因为指针不是数字。它们可以转换成数字,但是转换不是一般意义上的,而是可逆的。你需要一些东西,比如代码> STD::Algun,实际上说“我有对齐内存”。,或者直接在类型上使用
alignas
。“您并不真正关心数据是否位于缓存线的开头,只关心没有两个数据元素位于同一缓存线上。”例如,错误共享是正确的。但是我想在数组中使用SIMD指令,我不知道第一个元素在缓存行的中间随机启动的效果。@ GNZLBG:这是一个非常不同的问题!如果我的数据被适当地对齐,即使第一个元素不在缓存行的开头,它仍然可以工作。由于缓存线是我所知道的每种体系结构中的基本内存单元,我宁愿“做得正确”,并将我的第一个元素放在第一个元素的开头。您能否演示如何对一个双精度数组进行唯一的\u ptr静态检查,或者如何直接使用alignas?(或者只是在其他地方给我举一个这样的例子?)。听起来你是从问题X开始的,现在我们是问题Y。一个新的问题可能会得到一些新的答案。听起来你想要的是对齐的存储而不是对齐的类型。类型总是至少和对齐的大小一样大,这根本不是你想要的。也许可以试试std::aligned_storage
@KerrekSB我想对齐的存储这就是我说对齐内存时的意思。很抱歉,sizeof与alignof之间的混淆(我不知道alignof)。