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

标签 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;
} 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/

相关文章:

c - 条件宏中的转到标签技巧

C++ 如何为初始化为 vector 的类创建 move 语义

c++ - 如何转发声明 vector<B*>*(不是 vector<B> 或 vector<B*>)?

c++ - 正确地从 vector 中删除一个元素

python - 如何从结构中打印字符串?

c++ - 同一类中定义的两个结构可以相互访问吗?

c - 在 OpenCV 中打印 CV_8UC4 矩阵类型的值

c - 带文件IO的链表

c++ - 错误 LNK2005 : xxx already defined in MSVCRT. lib(MSVCR100.dll) C :\something\LIBCMT. lib(setlocal.obj)

C 结构和文件处理 newb - 挣扎