11

整列された型または整列された型を持つ構造体を値で渡すことは、一部の実装では機能しません。一部のメソッド(サイズ変更など)は引数を値で受け取るため、これにより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は失敗します。

このリンクが値で__m128を渡すことがわかりました

4

2 に答える 2

2

一般的にこれを行うための唯一の安全な方法は、参照によって渡すことだと思います。一部のプラットフォーム(Xbox 360など)は、レジスターでのベクトル引数の受け渡しをサポートしていますが、x86ではこれが不可能だと思います。

このstd::vector場合、割り当てられたメモリが16バイトに調整されていることを確認する必要があります。そうしないと、整列されていないベクトルに対してほとんどの操作を実行しようとしたときにクラッシュが発生します。

複数のプラットフォームをサポートしている場合、安全な計画は、typedef例えばを使用することです

typedef const MyVector& MyVectorParameter;

次に、ベクトルの値渡しをサポートするプラットフォームでtypedefを変更できます。

于 2010-12-13T00:26:54.300 に答える
1

頻繁に使用されるresize()関数がすべての配置を引き起こしており、おそらく__m128用のベクターテンプレートを特殊化することができますか?

于 2010-12-13T01:29:46.380 に答える