2013-03-09 96 views
2

比方说,我有一个结构如何使用C union将多个命名变量和另一个更大的命名变量等同起来?

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.xvector.values[1]可以为vector.y称,等

回答

3

作为C2011的,你可以在你的工会使用匿名结构成员,

union vector_union { 
    struct { 
     float x, y, z; 
    }; 
    __m128d packed; 
} vector; 

然后你可以使用vector.x等来访问组件,而vector.packed_values使用SSE指令。但请注意,该标准不保证struct成员已打包。 (但通常,编译器会打包它。)

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

+0

非常好!我不知道匿名结构已被添加!非常感谢你! – wyager 2013-03-09 21:46:38