假设我有一个结构
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.x
,vector.values[1]
可以称为vector.y
等等。
答案 0 :(得分:3)
从C2011开始,您可以在联盟中使用匿名结构成员
union vector_union {
struct {
float x, y, z;
};
__m128d packed;
} vector;
然后您可以使用vector.x
等来访问组件,vector.packed_values
可以使用SSE指令。但请注意,该标准不保证struct
成员已打包。 (但通常情况下,编译器会打包它。)
如果编译器不支持C2011,它可能会提供匿名结构作为扩展名。