class{ union{ struct{ wo liegt hier der Vorteil ?
-
Hi,
class Preis { public: union { struct { double y; char c; int anzahl; }; }; };
Ich frage mich gerade gibt es einen Vorteil von dieser Konstruktion??Einleuchtent ware mir class und union weil da ja alle Variablen an derselben Adresse beginnen aber was soll das struct da noch ??
-
Ich könnt mich auch täuschen, aber ich glaube, bei struct und class ist die Anordnung gleich und bei union anders.
Warum hast du die drei Variablen jetzt 3mal verpackt? Ich verstehe deine Frage nicht.
-
Optimizer schrieb:
Ich könnt mich auch täuschen, aber ich glaube, bei struct und class ist die Anordnung gleich und bei union anders.
Warum hast du die drei Variablen jetzt 3mal verpackt? Ich verstehe deine Frage nicht.Meine Frage ist warum so :
class Preis { public: union { struct { double y; char c; int anzahl; }; }; };
und nicht so
class Preis { public: union { double y; char c; int anzahl; }; };
-
Vorteil gegenüber was? Ich seh darin nicht den geringsten Sinn. Selbst wenn man die innere Struktur noch so ändert, dass auch tatsächlich eine Instanz gebildet wird
-
Zu dem Post direkt über meinem vorherigen:
Das ist nicht dasselbe.
-
das dürfte auch gar nicht kompilieren, oder? ich meine das zweite bsp.
union { int x; float y; char z; };
char ist nicht so groß wie float und int, das geht gar nciht. Da beginnen mömlich alle Variablen an der selben Stelle, wenn noch ne strut rum ist, dann beginnt die struct an der selben Stelle, wie vielleicht noch andere gleich große Structs
-
Maxi schrieb:
das dürfte auch gar nicht kompilieren, oder?
char ist nicht so groß wie float und int, das geht gar nciht.Na und? Sicher geht das.
-
Maxi schrieb:
das dürfte auch gar nicht kompilieren, oder? ich meine das zweite bsp.
char ist nicht so groß wie float und int, das geht gar nciht.für ein union wird immer soviel Speicher reserviert das sein größter Datentyp darin Platz findet. In diesem Fall wäre das größte Datenelement float.
koriegiere mich mal einer wenn ich mich da irren sollte
-
koriegiere mich mal einer wenn ich mich da irren sollte
Ok sizeof(int)==sizeof(float) mistens
Aber um auf 0x0000Fs Beispiel zurück zu kommen: die zwei Kodeschnippsel tun nicht das gleiche! Eine union einer struct is nicht gleich einer union der member der struct.
class Preis { public: union { struct { double y; char c; int anzahl; }; }; };
Ist das selbe wie:
class Preis { public: double y; char c; int anzahl; };
Eine union mit eimem member macht nie viel Sinn also nemme ich ein anderes Beispiel:
class S{ union{ struct{ char a1,b1,c1; double d1,e1; }; struct{ double a2,b2,c2; char d2,e2; }; }; };
Nun sieh dir mal die Offsets der Member an:
a1 0
b1 1
c1 2
d1 3
e1 11a2 0
b2 8
c2 16
d2 24
e2 25
Auch wenn der Standard diese Offsets nicht fordert sind sie aber sehr üblich. Hier ist sizeof(A)==26 Wenn du nun a1 mit a2,b1 mit b2,c1 mit c3,..., in jeweils eine union gepackt hättest dann würdest du unter dem Strich auf ein sizeof(A)==40 kommen weil du damit gefordert hättest, dass a1 mit a2, b1 mit b2,..., alligniert sind.
-
diese oben angedeutete schreibweise muss irgeneinen vorteil bringen, denn so sehen die matritzen in directx aus:
union{ struct{ float _11,_12,_13,_14; _21,_22,_23,_24, _31,_32,_33,_34, _41,_42,_43,_44, }; float m[4][4]; };
ich versteh nich genau, was das bringen soll, denn für die berechnung bringt die schreibweise keinerlei vorteile, da es soweit ich weis ja nich möglich ist, aus dem array der matrix so einfach in die float werte zu übertragen,und das array hat sonst auch keinerlei bedeutung.
aber eine frage: was würde passieren, wenn ich in der union das array gefüllt hab, ich aber auf die andren float werte zugreife?
-
gcc sagt dazu (aber nur mit -ansi -pedantic):
warning: ISO C++ prohibits anonymous structs
-
oops ganz vergessen, da is nochn typedef dum
typedef struct _D3DMATRIX {
-
Das hat ja nichts mit der anonymen Struktur zu tun.
-
Irgendwer schrieb:
koriegiere mich mal einer wenn ich mich da irren sollte
Ok sizeof(int)==sizeof(float) mistens
das hab ich ja garnicht behauptet, eher sowas
sizeof(deinUnion) == sizeof(größterDatentypImUnion) //beispiel: union { int a; float b; } test; sizeof(test) == sizeof(float);
-
union{ struct{ float _11,_12,_13,_14; _21,_22,_23,_24, _31,_32,_33,_34, _41,_42,_43,_44, }; float m[4][4]; };
Da die Struktur und die 4*4 Float-Matrix den gleichen Platz einnehmen, kannst du
über m[x][y] auf die member der Struktur zugreifen, das ist der Sinn davon.
-
Könnte man nicht auch einfach den []-Operator überladen?
-
hmm und wozu brauch man dann die einzelnen float werte selber? mithilfe des arrays sind sie doch "relativ" nutzlos...
-
Der Sinn ist mir nicht bekannt.
Und den []-Operator zu überladen wäre doch um einiges Aufwändiger als ne union
zu benutzen.
-
Die Union ist doch generell Blödsinn, weil ich über das 2d-Array auf die Werte zugreifen kann.
-
imho dient es wahrscheinlich nur der übersichtlichkeit für den programmierer, da er nämlich im kopf immer umrechnen müsste,wenn er einen wert der matrix abfragen will,falls er das array benutzt(matritzen fangen bei 1 an, arrays bei 0, das kann manchmal ne interessante fehlerquelle sein;))