2

構造体があるとしましょう

struct vector_struct {
    float x;
    float y;
    float z;
} vector;

vector.x上記のコードでできるように、x、y、および z の値をアドレス指定できるようにしたいと考えています。ただし、明示的な方法で SSE SIMD 命令を使用した高速演算を容易にするために、次のことを行いたいと考えています。

union vector_union {
    struct vector_struct float_values;
    __m128d packed_values;
} vector;

ベクトルで SIMD 命令を実行したい場合は、vector.packed_valuesさまざまな SIMD 命令 (乗算など) の引数として使用できます。しかし、これは非常に醜いように見えxます。

foo = vector.float_values.x

ただの代わりに

foo = vector.x

それで、私の質問は、複数の名前付き変数を別の単一の名前union付き変数に関連付けるを作成する方法があるかどうかです。何かのようなもの

union vector_union {
    float values[3];
    __m128d packed_values;
} vector;

vector.values[0]として参照できる場合を除き、vector.x、などvector.values[1]として参照できます。vector.y

4

1 に答える 1

3

C2011 の時点で、union で匿名の構造体メンバーを使用できます。

union vector_union {
    struct {
        float x, y, z;
    };
    __m128d packed;
} vector;

etc. を使用vector.xしてコンポーネントにアクセスしvector.packed_values、SSE 命令を使用できます。ただし、標準はstructメンバーがパックされていることを保証していないことに注意してください。(しかし、通常、コンパイラはそれをパックします。)

コンパイラが C2011 をサポートしていない場合、匿名構造体を拡張機能として提供することがあります。

于 2013-03-09T21:21:46.550 に答える