特定のアライメント要件を持つ単純なタイプを定義する場合、そのタイプのはすべての単一要素std::vector<t>
のアライメントを尊重すべきではありませんか?
次の例を考えてみましょう
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
アライメント要件は、clang 3.2 ( の有無にかかわらず) によって暗黙のうちに (警告なしで) 違反されていることがわかりましたが、-stdlib=libc++
gcc 4.8.0 は、テンプレート引数の属性を無視するという警告を発行します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 (今回は警告なし) の最初の要素 (したがって他のすべての要素も) を調整できません。そのため、実装には明らかに 2 つの問題があります。1 つ目std::allocator<type>
は、最初の要素についてもアラインメント要件を無視する (違法?) ことと、2 つ目は、後続の要素のアラインメントを確保するためにパディングが適用されないことです。
––––––––––––</p>
edit SSE/AVX 操作に適切に整列されたメモリを取得する方法について 、関連するより実用的な質問があります。対照的に、C++ 標準 (2011 年現在) の時点でstd::vector<>
(またはstd::allocator<>
) が尊重されるべきではないかどうかを知りたいです。alignas
その他の質問に対する答えはどれも、この質問に対する適切な答えではありません。