特定のアラインメント要件を持つ単純なタイプを定義する場合、そのタイプのstd::vector<t>
は、すべての単一のエレメントに対してアライメントを守るべきではない?std :: vector honor alignof(value_type)する必要がありますか?
次の例
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
を考えるIは、GCC 4.8.0は、それが無視される警告を発行しながら、(または-stdlib=libc++
なし)3.2を打ち鳴らすことによって違反アライメント要件(警告なし)サイレントであることがわかっテンプレート引数の属性はstd::vector
です(intelコンパイラはalignas
を理解するにはあまりにも愚かですが、代わりに__declspec(align(32))
を使用すると、clangのように動作します)。両方とも、アサートをトリガーするコードを作成します。
これは正しく動作していますかclang(およびicpc)のバグですか、gccの問題ですか?コメントで提起質問に答える
編集 :私は
typedef typename std::aligned_storage<sizeof (avx_point),
alignof(avx_point)>::type avx_storage;
を定義した場合、私は
sizeof (avx_storage) == 32;
alignof(avx_storage) == 32;
しかしstd::vector<avx_storage>
はまだ最初の要素を整列するために失敗した(したがって、すべての取得他の人も)clangとgccのために(今回は警告なしに)。したがって、最初に、std::allocator<type>
は、最初の要素であっても整列要件を無視します(illegal?)。次の要素の整列を確実にするために余白が適用されないという2つの問題が明らかです。
「std :: vector>」を比較するとどうなりますか? –
Useless