アライメントされた型または構造体を値渡しで渡すことは、一部の実装では機能しません。これにより、STLコンテナが破損します。これは、メソッドの一部(サイズ変更など)が値で引数を取るためです。アライメントされた型と値による引数の受け渡し
Visual Studio 2008でいくつかのテストを実行し、値の受け渡しがいつどのように失敗するかは完全にはわかりません。私の主な関心事は、機能fooです。それはうまくいくようですが、それはインライン展開や他の偶然の結果かもしれませんか?署名をに変更するとどうなりますかvoid foo(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);
}
EDIT。 STLは、値渡しの問題が残っているため、アラインメントされたアロケータでも失敗します。このリンクpass __m128 by value
コンパイルエラー/警告は何ですか?私は「仮パラメータ...整列しない」のようなものを仮定していますか? – celion
これは私が得るものです。エラーC2719: 'unnamed-parameter':仮引数__declspec(align('16 '))はアライメントされません – watson1180
x64では、関数の引数は16バイトのアライメントをサポートしています。私はそれがあなたの直面する問題を解決するわけではないことを知っていますが、ちょっと、何よりもわずかに優れています。 ;) – jalf