2015-06-14 8 views
6

Betrachten Sie die folgende Struktur:Wird inaktives Union-Mitglied des gleichen Typs wie aktiv gelesen?

struct vec4 
{ 
    union{float x; float r; float s}; 
    union{float y; float g; float t}; 
    union{float z; float b; float p}; 
    union{float w; float a; float q}; 
}; 

Etwas Ähnliches scheint in Beispiel verwendet werden, GLM zu GLSL-ähnlichen Typen wie vec4, vec2 etc .. bieten

Aber obwohl die beabsichtigte Verwendung wie ist dies möglich

vec4 a(1,2,4,7); 
a.x=7; 
a.b=a.r; 

zu machen, so scheint es, ein nicht definiertes Verhalten zu sein, weil, wie here zitiert ,

In einer Union kann höchstens einer der Datenmitglieder zu jeder Zeit aktiv sein, dh der Wert von höchstens einem der Datenmitglieder kann jederzeit in einer Union gespeichert werden.

Wäre es nicht besser, z.B. Verwenden Sie einfach die Struktur so etwas wie folgt definieren?

struct vec4 
{ 
    float x,y,z,w; 
    float &r,&g,&b,&a; 
    float &s,&t,&p,&q; 
    vec4(float X,float Y,float Z,float W) 
     :x(X),y(Y),z(Z),w(W), 
     r(x),g(y),b(z),a(w), 
     s(x),t(y),p(z),q(w) 
    {} 
    vec4() 
     :r(x),g(y),b(z),a(w), 
     s(x),t(y),p(z),q(w) 
    {} 
    vec4(const vec4& rhs) 
     :x(rhs.x),y(rhs.y),z(rhs.z),w(rhs.w), 
     r(x),g(y),b(z),a(w), 
     s(x),t(y),p(z),q(w) 
    {} 
    vec4& operator=(const vec4& rhs) 
    { 
     x=rhs.x; 
     y=rhs.y; 
     z=rhs.z; 
     w=rhs.w; 
     return *this; 
    } 
}; 

Oder arbeite ich um ein nicht existierendes Problem? Gibt es vielleicht eine spezielle Erklärung, die den Zugang zu in gleicher Weise getippten inaktiven Gewerkschaftsmitgliedern ermöglicht?

+0

[Verwandte] (http://stackoverflow.com/questions/6512710/union-of-same-type-in-c) –

Antwort

-1

Ich denke, das Zitat, auf das Sie sich beziehen, ist darauf gerichtet, verschiedene Typen mit in der Vereinigung zu haben.

Dies sind verschiedene Daten, bequem in der gleichen Struktur gespeichert, Gewerkschaften sollen nicht ein Casting-Mechanismus sein.

GLM Ansatz verwendet die gleichen Daten und verwendet die Union für eine Alias-Mechanik.

Ihr Ansatz könnte "besser" C++ sein, aber sein schlechteres "Engineering". Vektormathematik muss schnell sein, und je kleiner, desto besser in diesem Fall.

Ihre Implementierung macht den Vektor 3 mal größer. sizeof(glm::vec4); // 16 während sizeof(your_vec4); // 48 - ouch Wenn Sie eine große Armount von denen, die häufig der Fall ist, verarbeitet, dreimal mehr Cache vermisst mit your_vec4.

Ich denke, Sie haben Recht, obwohl Glm Verwendung von Gewerkschaften als Alias ​​ist ein bisschen viel, während ich nicht sicher bin, ob es undefined ist, aber diese Art von Dingen habe ich viel gesehen ohne viel Problem, und Glm ist weit verbreitet benutzt.

Ich sehe nicht wirklich die Notwendigkeit, Glsl in C++ zu emulieren, und struct { float x,y,z,w; } wäre besser (zumindest in meinen Gedanken).