如何使用C联合来等同多个命名变量和另一个更大的命名变量?

时间:2013-03-09 20:41:06

标签: c vector struct sse unions

假设我有一个结构

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

我希望能够将x,y和z值解析为vector.x等,以上代码允许我这样做。但是,为了便于以明确的方式使用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.xvector.values[1]可以称为vector.y等等。

1 个答案:

答案 0 :(得分:3)

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

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

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

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