整列された型または整列された型を持つ構造体を値で渡すことは、一部の実装では機能しません。一部のメソッド(サイズ変更など)は引数を値で受け取るため、これによりSTLコンテナーが破損します。
Visual Studio 2008でいくつかのテストを実行しましたが、値渡しがいつどのように失敗するかが完全にはわかりません。私の主な関心事は関数fooです。正常に動作しているように見えますが、インライン化またはその他の偶然の結果である可能性がありますか?署名をvoidfoo(const __m128&)に変更するとどうなりますか?
ご意見をいただければ幸いです。ありがとうございました。
struct A
{
__m128 x;
int n;
};
void foo(__m128);
void bar(A);
void f1()
{
// won't compile
// std::vector<A> vec1(3);
// compiles, but fails at runtime when elements are accessed
std::vector<__m128> vec2(3);
// this seems to work. WHY???
std::vector<__m128, some_16_byte_aligned_allocator<__m128> > vec3(3);
__m128 x;
A a;
// passed by value, is it OK?
foo(x);
// won't compile
//bar(a);
}
編集。値の受け渡しの問題が残っているため、整列されたアロケータでもSTLは失敗します。