"Union" in Klassen



  • Hallo,

    angenommen man hat folgende Klasse:

    class Vector3D
    {
        /* ... */
    
        union
        {
            float X, Width;
        };
        union
        {
            float Y, Height;
        };
        union
        {
            float Z, Depth;
        };
    };
    
    Vector3D MyVector;
    
    MyVector.X;
    MyVector.Width;
    

    Würde der C++ Compiler in diesem Beispiel dann einfach für "Width" und "X" die selbe Speicheraddresse verwenden sodass absolut kein Geschwindigkeits Verlusst auftritt??



  • Ja, das union ist ja auch so deffineirt das sich alle Variablen darin den selben Speicherbereich teilen, mußt nur aufpassen das das ganze aufgeht. Kannst dir auch ein kleines Testprogramms chreiben und die Adressen vergleichen.



  • aber hässlich ists trotzdem?!
    wozu brauchst du denn 2 bezeichner für ein und das selbe? wenn es unbedingt sein muss, könntest du noch referenzen nehmen - die wird der compiler wegoptimieren, wenn er merkt, dass die eine immer auf den gleichen wert zeigt...

    bb



  • Ich geb dir mal ein Beispiel da sich benutze:

    Vector3
    {
    public:
        union
        {
            struct
            {
                float x;
                float y;
                float z;
            };
            struct
            {
                float u;
                float v;
                float w;
            };
            float vector[3];
        };
    };
    

    Das sind alles im Grunde nur Alias, abe rich kann sie passend benutzen x,y,z wenn ich korodinaten nehme, und u,v,w wenn ich Texturkoordinaten will und den vector[3] wenn ich nen Zeiger brauche. Ob das schön aussieht ist mir eigentlich egal, es ist sehr parktisch.

    Oder sowas hier

    union
    {
        DWORD irgendwas[50];
        float irgendwas[50];
    };
    

    Hier erspart mir das union lästige reinterpret casts und jeder sieht was ich damit bewirken will.



  • Würde der C++ Compiler in diesem Beispiel dann einfach für "Width" und "X" die selbe Speicheraddresse verwenden sodass absolut kein Geschwindigkeits Verlusst auftritt??

    Was hat das mit Geschwindigkeit zu tun?


Log in to reply