2013-03-09 103 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