003
18.08.2005, 23:58 Uhr
Pablo
Supertux (Operator)
|
Du kannst dir vorstellen, dass eine Union ein besonderer struct ist. Bei einem Struct wie bei einer Union kann man viele Member haben, die unterschiedliche Länge haben (hiermit ist die Anzahl der bytes gemeint, die gebraucht werden, um die Datentypen darzustellen, z.b. 4 für int, 8 für double, usw).
Schauen uns wir ein Bsp an:
C++: |
#include <iostream>
struct mystruct { int a; double b; };
int main(void) { std::cout << "Ein `mystruct` Objekt benötigt " << sizeof(mystruct) << " Bytes für die Darstellung" << std::endl; mystruct x; x.a = 10; x.b = 1000.0/3.0; std::cout << "x.a = " << x.a << "; x.b = " << x.b << std::endl; return 0; }
|
Die Ausgabe ist:
Code: |
Ein `mystruct` Objekt benötigt 12 Bytes für die Darstellung x.a = 10; x.b = 333.333
|
Ein `mystruct` Objekt benötigt 12 Bytes. 4 Bytes wegen dem int (a) und 8 mehr wegen dem double (b). D.h. der Speicher des structs ist sozusagen eine Aneinanderreihung von einem int und einem double. Nun was passiert, wenn ich jetzt union statt struct benutze?
C++: |
#include <iostream>
union mystruct { int a; double b; };
int main(void) { std::cout << "Ein `mystruct` Objekt benötigt " << sizeof(mystruct) << " Bytes für die Darstellung" << std::endl; mystruct x; x.a = 10; x.b = 1000.0/3.0; std::cout << "x.a = " << x.a << "; x.b = " << x.b << std::endl; return 0; }
|
Die Ausgabe ist:
Code: |
Ein `mystruct` Objekt benötigt 8 Bytes für die Darstellung x.a = 1431655765; x.b = 333.333
|
Jetzt wird nur 8 Bytes benötigt, also so viel wie das Member, das am meisten braucht, in dem Fall das double b. Aber ich kann die Members nicht mehr gleichzeitig benutzen, denn statt 2 "Speicherfelder" gibt es nur eine und alle Members von der Union teilen sich den gleichen Speicher. Deswegen wird so viel benötigt, wie das größte Member. Das ist keine Aneinanderreihung mehr von int und double. Aber x kann als int oder double benutzt werden, je nachdem auf welches Member man zugreift. Macht man x.a dann wird der Speicher als der von einem "int" interpretiert. Macht man x.b dann wird der Speicher als der von einem "double" interpretiert. Ich hoffe, so ist dir klarer geworden.
edit:
graphisch könnte man sich so vorstellen:
Code: |
Bei dem struct
4 bytes int(a) 8 bytes double(b) ^_______________ __________________________________ |_______________|__________________________________|
Bei der union
8 bytes int/double (a und b) ^__________________________________ |__________________________________|
|
PS: Beachte, dass die Größeangabe (4,8 Bytes) von der Rechnerarchitektur abhängen, hier am Bsp meines Intel P3. -- A! Elbereth Gilthoniel! silivren penna míriel o menel aglar elenath, Gilthoniel, A! Elbereth! Dieser Post wurde am 19.08.2005 um 00:06 Uhr von Pablo editiert. |