假设我有一个结构
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;
现在,如果我想在 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
等
最佳答案
从 C2011 开始,您可以在 union 体中使用匿名结构成员,
union vector_union {
struct {
float x, y, z;
};
__m128d packed;
} vector;
然后您可以使用vector.x
等来访问组件,并使用vector.packed_values
来使用SSE指令。但请注意,该标准并不保证 struct
成员已打包。 (但通常情况下,编译器会打包它。)
如果编译器不支持 C2011,它可能会提供匿名结构作为扩展。
关于c - 如何使用 C union 来使多个命名变量和另一个更大的命名变量相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15315693/