467 Stimmen

Unterschied zwischen einer Struktur und einem Verband

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?

12voto

Ravi Kanth Punkte 121

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.

11voto

Piotr Lesnicki Punkte 9132

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).

11voto

friol Punkte 6956

" Gewerkschaft " und " Struktur " sind Konstruktionen der Sprache C. Es ist unangebracht, von einem Unterschied auf "Betriebssystemebene" zu sprechen, da es sich um die Compiler die einen anderen Code erzeugt, wenn Sie das eine oder andere Schlüsselwort verwenden.

11voto

skanda93 Punkte 195

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.

10voto

Christian C. Salvadó Punkte 763569

Eine Struktur weist die Gesamtgröße aller Elemente in ihr zu.

Eine Union weist nur so viel Speicher zu, wie ihr größtes Mitglied benötigt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X