gpt4 book ai didi

c - 如何使用 C union 将多个命名变量和另一个更大的命名变量等同起来?

转载 作者:行者123 更新时间:2023-12-04 05:07:40 28 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





How to compile C code with anonymous structs / unions?

(10 个回答)


8年前关闭。




假设我有一个结构

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成员(member)已打包。 (但通常情况下,编译器会打包。)

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

关于c - 如何使用 C union 将多个命名变量和另一个更大的命名变量等同起来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15315693/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com