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;

除了 wherevector.values[0]可以被称为vector.x,vector.values[1]可以被称为vector.y, 等等

4

1 回答 1

3

从 C2011 开始,您可以在联合中使用匿名结构成员,

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

然后您可以使用vector.xetc. 访问组件,并vector.packed_values使用 SSE 指令。但是请注意,该标准不保证该struct成员已打包。(但通常,编译器会打包它。)

如果编译器不支持 C2011,它可能会提供匿名结构作为扩展。

于 2013-03-09T21:21:46.550 回答