Beim Umgang mit Strukturen in C spielt die Speicherausrichtung eine entscheidende Rolle bei der Optimierung der Speichernutzung und -leistung. Wenn Sie sich über den Unterschied in der Speicherausrichtung zwischen den folgenden beiden Strukturen wundern:
<code class="c">typedef struct { unsigned short v1; unsigned short v2; unsigned short v3; } myStruct1; typedef struct { unsigned short v1; unsigned short v2; unsigned short v3; int i; } myStruct2;</code>
wobei sowohl myStruct1 als auch myStruct2 die gleiche kombinierte Datengröße von 6 Bytes haben, myStruct2 jedoch eine Größe von 12 Bytes meldet sizeof() liegt die Antwort in der Speicherausrichtung.
Auf den meisten 32-Bit-Maschinen beträgt die Ausrichtungsgrenze normalerweise 4 Bytes. Dies bedeutet, dass Strukturen auf das nächste Vielfache von 4 Bytes ausgerichtet werden. In myStruct1 ist jedes Mitglied 2 Byte groß, daher wird kein Abstand zwischen ihnen eingefügt und die tatsächliche Größe bleibt bei 6 Byte.
In myStruct2 erfordert das Hinzufügen einer 4-Byte-Ganzzahl (int) jedoch a 4-Byte-Ausrichtungsgrenze. Da die anfänglichen 6 Byte Daten aus der ursprünglichen Struktur nicht an einer 4-Byte-Grenze ausgerichtet sind, werden 2 Byte Auffüllung zwischen v3 und i eingefügt. Durch diese Auffüllung wird sichergestellt, dass i an einer 4-Byte-Grenze beginnt, was zu einer Gesamtgröße von 12 Bytes für myStruct2 führt.
Denken Sie daran, dass Strukturen in den meisten Fällen nur an der Grenze ihres größten Mitglieds ausgerichtet werden. In diesem Fall bestimmt das int-Mitglied in myStruct2 die Ausrichtungsgrenze, was den Unterschied in der Speicherausrichtung zwischen den beiden Strukturen erklärt.
Das obige ist der detaillierte Inhalt vonWarum gibt „sizeof(myStruct2)' 12 Bytes zurück, während „sizeof(myStruct1)' 6 Bytes zurückgibt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!