Gibt es ein gutes Beispiel, das den Unterschied zwischen einer struct
und eine union
? Im Grunde weiß ich, dass struct
verwendet den gesamten Speicher seines Mitglieds und union
verwendet den größten Speicherplatz der Mitglieder. Gibt es weitere Unterschiede auf Betriebssystemebene?
Antworten
Zu viele Anzeigen?Ja, der Hauptunterschied zwischen struct und union ist derselbe wie von Ihnen angegeben. Struct verwendet den gesamten Speicher seines Mitglieds und Union verwendet den Speicherplatz des größten Mitglieds.
Aber der Unterschied liegt im Nutzungsbedarf des Speichers. Die beste Nutzung der Union kann in den Prozessen von Unix gesehen werden, wo wir Signale verwenden. So kann ein Prozess immer nur auf ein Signal gleichzeitig reagieren. Die allgemeine Deklaration wird also sein:
union SIGSELECT
{
SIGNAL_1 signal1;
SIGNAL_2 signal2;
.....
};
In diesem Fall nutzt der Prozess nur den höchsten Speicherplatz aller Signale. Wenn Sie in diesem Fall jedoch struct verwenden, entspricht der Speicherverbrauch der Summe aller Signale. Das macht einen großen Unterschied.
Zusammenfassend lässt sich sagen, dass Union gewählt werden sollte, wenn Sie wissen, dass Sie auf eines der Mitglieder gleichzeitig zugreifen.
Sie haben es, das ist alles. Aber was ist der Sinn von Gewerkschaften?
Sie können am selben Ort verschiedene Arten von Inhalten ablegen. Sie müssen wissen den Typ dessen, was Sie in der Gewerkschaft gespeichert haben (so oft Sie es in einer struct
mit einem Typ-Tag...).
Warum ist das wichtig? Nicht wirklich wegen des Platzgewinns. Ja, man kann einige Bits gewinnen oder etwas auffüllen, aber das ist nicht mehr der Hauptpunkt.
Es dient der Typsicherheit und ermöglicht eine Art "dynamische Typisierung": Der Compiler weiß, dass Ihr Inhalt verschiedene Bedeutungen haben kann, und die genaue Bedeutung, wie Sie ihn interpretieren, hängt von Ihnen zur Laufzeit ab. Wenn Sie einen Zeiger haben, der auf verschiedene Typen zeigen kann, MÜSSEN Sie eine Union verwenden, andernfalls kann Ihr Code aufgrund von Aliasing-Problemen fehlerhaft sein (der Compiler sagt zu sich selbst "Oh, nur dieser Zeiger kann auf diesen Typ zeigen, also kann ich diese Zugriffe optimieren...", und es können schlimme Dinge passieren).
Nicht technisch gesprochen bedeutet:
Annahme: Stuhl = Speicherblock, Personen = Variable
Struktur : Wenn es 3 Personen sind, können sie in Stühlen ihrer Größe entsprechend sitzen.
Gewerkschaft : Wenn es 3 Personen sind nur einer Alle müssen den gleichen Stuhl benutzen, wenn sie sitzen wollen.
Technisch gesehen bedeutet dies:
Das unten erwähnte Programm gibt einen tiefen Einblick in die Struktur und den Zusammenschluss.
struct MAIN_STRUCT
{
UINT64 bufferaddr;
union {
UINT32 data;
struct INNER_STRUCT{
UINT16 length;
UINT8 cso;
UINT8 cmd;
} flags;
} data1;
};
Gesamtgröße von MAIN_STRUCT =sizeof(UINT64) für bufferaddr + sizeof(UNIT32) für union + 32 bit für padding (abhängig von der Prozessorarchitektur) = 128 bits . Für die Struktur erhalten alle Mitglieder den Speicherblock zusammenhängend.
Union erhält einen Speicherblock mit der maximalen Größe des Mitglieds (hier 32 Bit). Innerhalb der Union liegt eine weitere Struktur (INNER_STRUCT), deren Mitglieder einen Speicherblock mit einer Gesamtgröße von 32 Bit (16+8+8) erhalten. In union entweder INNER_STRUCT(32 bit) Mitglied o Daten (32 Bit) zugegriffen werden kann.