如何使用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,它可能会提供匿名结构作为扩展。太棒了!我不知道添加了匿名结构!非常感谢你!