unions in c / c++

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

unions in c / c++
hi,

was genau sind denn unions und fuer was braucht man die?
habe schon oefter davon gelesen, verstehe aber nicht, was
das ganze ist…


Wenn mich nicht alles täuscht, ist eine Union ein ähnliches Konstrukt wie ein Struct. Für eine Union wird aber nur so viel Speicher belegt, wie dein größter Typ in der Union belegt.

Bsp:
union CDUCSU {
short int stoiber;
int merkel;
};

belegt keine 6 Bytes, sondern nur 4. Man sollte also immer nur eine Variable der Union besetzen, sonst kommt irgendwann woh nur noch Blödsinn raus.

Bsp:
CDUCSU.merkel = 0x215CA23F;
CDUCSU.stoiber = 0x13D8;

überschreibt (in Annahme, dass wir uns auf einer BigEndian Maschine befinden) stoiber ein paar Bytes von merkel und am Ende kommt wohl ein Hybrid raus, wenn man merkel wieder benutzen will.
Also
cout << CDUCSU.merkel;
liefert dann 0x215C13D8

Verwenden würde ich es nicht unbedingt, weil man sicher sehr leicht Fehler baut, die man später schwer findet.


mann,
das ist mal gut und witzig erklaert! passt gar nicht zu deinem subtitel “griesgram” :].
wofuer soll man denn dann mal so tolle unions brauchen,
der beschreibung nach ist es nicht so, dass ich schon
immer nach so einer funktion gelechzt habe…


Das stammt noch aus der Zeit in der Speicher rar und teuer war…

Heutzutage ist Debuggen wesentlich kostspieliger als Speicher, deswegen sind unions nicht mehr so in Mode.


Unions sind da praktisch, wo du auf verschiedene Strukturen unter unterschiedlichen Datentypen gleichzeitig zugreifen willst. So kannst du z.B. einen long und ne struct aus 2 shorts in eine union packen und so sehr elegant auf beide Hälften des long zugreifen, oder andersrum einen long aus 2 shorts zamsetzen.

// mir fällt grade die genaue syntax nicht ein...
union ZAHL
{
	long x;
	struct
	{
		short lo;
		short hi;
	}
}

ZAHL z;
z.lo = 0x1234;
z.hi = 0x5678;

assert(z.x == 0x12345678);

hey,
das klingt wirklich wie eine sinnvolle anwendung! thx!