„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Warum gibt „sizeof(myStruct)“ 6 Bytes statt 8 Bytes für eine Struktur mit drei „unsigned short“-Mitgliedern zurück?

Warum gibt „sizeof(myStruct)“ 6 Bytes statt 8 Bytes für eine Struktur mit drei „unsigned short“-Mitgliedern zurück?

Veröffentlicht am 18.11.2024
Durchsuche:647

Why does `sizeof(myStruct)` return 6 bytes instead of 8 bytes for a struct with three `unsigned short` members?

Speicherausrichtung in C-Strukturen: Größenunterschiede verstehen

Bei der Arbeit mit C-Strukturen spielt die Speicherausrichtung eine entscheidende Rolle bei der Bestimmung der tatsächlichen Größe Größe der Struktur im Speicher. Unter Speicherausrichtung versteht man die Platzierung von Datenstrukturen in Speicheradressen, die durch bestimmte Grenzen teilbar sind. Dies gewährleistet einen effizienten Datenzugriff und eine Leistungsoptimierung.

Stellen Sie sich einen 32-Bit-Computer vor, bei dem die Speicherausrichtung normalerweise auf 4 Bytes eingestellt ist. In diesem Zusammenhang eine Struktur, die aus mehreren vorzeichenlosen kurzen Mitgliedern besteht, wie zum Beispiel:

typedef struct {
    unsigned short v1;
    unsigned short v2;
    unsigned short v3;
} myStruct;

Man würde erwarten, dass die Speichergröße dieser Struktur 8 Bytes (3 x 2 Bytes) beträgt. Der Operator sizeof(myStruct) gibt jedoch nur 6 Bytes zurück. Diese Diskrepanz kann auf die Ausrichtungsanforderung zurückgeführt werden.

Im ersten Beispiel belegt jedes kurze Mitglied 2 Bytes. Da die Ausrichtungsgrenze 4 Byte beträgt, wird zwischen den Elementen kein Abstand eingefügt. Somit bleibt die Gesamtgröße bei 6 Bytes.

Im Gegensatz dazu ändert die Einführung eines int-Mitglieds in die Struktur, wie unten gezeigt, das Ausrichtungsverhalten:

typedef struct {
    unsigned short v1;
    unsigned short v2;
    unsigned short v3;
    int i;
} myStruct;

In diesem Fall erfordert das int-Mitglied eine 4-Byte-Ausrichtungsgrenze. Um sicherzustellen, dass diese Anforderung erfüllt wird, werden 2 Bytes Füllmaterial zwischen dem letzten unsigned short-Element (v3) und dem int-Element (i) eingefügt. Dies führt zu einer Gesamtgröße von 12 Bytes (6 Bytes Daten in Shorts, 2 Bytes Padding und 4 Bytes Daten in Int).

Daher ergibt sich der Unterschied in der Speichergröße zwischen den beiden Strukturen die Ausrichtungsanforderungen ihrer Mitgliedstypen. In der ersten Struktur wird die Ausrichtungsgrenze durch die kurzen Elemente selbst erreicht, während in der zweiten Struktur zusätzliche Auffüllung erforderlich ist, um die Ausrichtungsgrenze des int-Elements zu erfüllen.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3