Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::vector是否应为(值\类型)?_C++_C++11_Alignment_Containers - Fatal编程技术网

C++ std::vector是否应为(值\类型)?

C++ std::vector是否应为(值\类型)?,c++,c++11,alignment,containers,C++,C++11,Alignment,Containers,如果我定义了一个具有特定对齐要求的简单类型,那么所述类型的std::vector不应该尊重每个元素的对齐吗 考虑下面的例子 typedef std::array<double,3> alignas(32) avx_point; std::vector<avx_point> x(10); assert(!(std::ptrdiff_t(&(x[0]))&31) && // assert that x[0] is 32-byte align

如果我定义了一个具有特定对齐要求的简单类型,那么所述类型的
std::vector
不应该尊重每个元素的对齐吗

考虑下面的例子

typedef std::array<double,3> alignas(32) avx_point;
std::vector<avx_point> x(10);
assert(!(std::ptrdiff_t(&(x[0]))&31) &&   // assert that x[0] is 32-byte aligned
       !(std::ptrdiff_t(&(x[1]))&31));    // assert that x[1] is 32-byte aligned
我明白了

但是
std::vector了解如何为SSE/AVX操作获得适当对齐的内存。相比之下,我想知道<代码> STD::vector < /Cuff>(或<代码> STD::分配器< /代码>)不应遵守C++标准的代码> > Alcasas < /C> >(如2011)。其他问题的答案都不是这个问题的合适答案

首先,该std::分配器忽略任何对齐要求,即使是第一个元素(非法?)

我远非分配器方面的专家,但在我看来,不幸的是,这是合法的行为。更准确地说,分配器可能会忽略请求的对齐。事实上,[分配器要求],17.6.3.5/6规定:

如果分配器不支持与特定过度对齐类型关联的对齐,则实例化 该类型的分配器的配置可能会失败分配器也可以默默地忽略请求的对齐

您可以编写自己的分配器以提供对齐的内存。我以前在我的工作中也这样做过,但不幸的是,出于版权的原因,我不能透露代码:-(我能说的是,很明显:它是基于
\u aligned\u malloc
\u aligned\u free
(这是微软的扩展)的。或者你可以在谷歌上搜索“aligned allocator”,然后会出现一些选项,其中一个是

我强调我不是这个对齐分配器的作者,我从来没有使用过它

更新

上面的对齐分配器适用于Visual Studio/Windows,但它可以用作在其他平台上实现对齐分配器的基础。您可以使用posix函数系列或C11函数
aligned\u alloc


请参阅帖子。

出于兴趣,如果您比较
std::vector
,会发生什么情况?引入关键字
alignas
alignof
的标准逻辑可能重复,只是为了允许分配器忽略它们?顺便说一句,我有自己的
aligned\u分配器
,效果非常好Boost还提供了一个对齐的分配器:
Boost::alignment::aligned_分配器
typedef typename std::aligned_storage<sizeof (avx_point),
                                      alignof(avx_point)>::type avx_storage;
sizeof (avx_storage) == 32;
alignof(avx_storage) == 32;