如何使用C并集将多个命名变量与另一个更大的命名变量相等?

如何使用C并集将多个命名变量与另一个更大的命名变量相等?,c,vector,struct,sse,unions,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; } vect

假设我有一个结构

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_value
作为各种SIMD指令(如乘法)的参数。然而,这看起来非常难看,好像我想要
x
的值,我就必须写

foo = vector.float_values.x
而不仅仅是

foo = vector.x
那么,我的问题是,是否有任何方法可以创建一个将多个命名变量与另一个命名变量关联起来的
联合。差不多

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

除非
vector.values[0]
可以称为
vector.x
vector.values[1]
可以称为
vector.y
,等等。

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

union vector_union {
    struct {
        float x, y, z;
    };
    __m128d packed;
} vector;
然后您可以使用
vector.x
等访问组件,并使用
vector.packed_值
使用SSE指令。但是,请注意,该标准并不保证
struct
成员是打包的。(但通常情况下,编译器会将其打包。)


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

太棒了!我不知道添加了匿名结构!非常感谢你!