Der bereitgestellte Code zeigt ein faszinierendes Verhalten:
<br>Typ-A-Struktur {</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">a bool b int64 c int
}
Typ-B-Struktur {
b int64 a bool c int
}
Beim Drucken der Größen von A{} und B{} verwenden unsicher.Sizeof, wir erhalten überraschend Ergebnisse:
<br>fmt.Println(unsafe.Sizeof(A{})) // Ausgabe: 24<br>fmt.Println(unsafe.Sizeof(B{})) / / Ausgabe: 16<br>
Warum haben diese Strukturen trotz der gleiche Felder?
Die Antwort liegt in der Feldausrichtung. In Go müssen Adressen von Variablen basierend auf ihrem Typ ausgerichtet werden, und diese Ausrichtung ist besonders wichtig für Typen wie int64 (8-Byte-Ausrichtung). Im Fall von A ist das erste Feld a ein Bool-Wert, der nur 1 Byte Speicherplatz benötigt. Nach diesem Feld gibt es eine implizite 7-Byte-Auffüllung, um das nächste Feld b (vom Typ int64) an einer 8-Byte-Grenze auszurichten. Da jedoch im Fall von B das erste Feld b bereits an einer 8-Byte-Grenze ausgerichtet ist, ist keine implizite Auffüllung erforderlich, was zu einer kleineren Strukturgröße von 16 Bytes führt.
< h3>Größe einer leeren Struktur
Im weiteren Verlauf stoßen wir auf ein weiteres interessantes Element case:
<br>type C struct {<br>}<br>
Beim Drucken von unsafe.Sizeof(C{}) kommt es unerwartet Erhalten Sie eine Ausgabe von 0. Wie ist das möglich, wenn man bedenkt, dass jede Struktur einige belegt? Speicher?
Die Go-Spezifikation besagt, dass eine Struktur oder ein Array ohne Felder oder Elemente mit einer Größe größer als Null eine Größe von hat null. Dies impliziert auch, dass zwei unterschiedliche Variablen der Größe Null dieselbe Speicheradresse teilen können. Dies ist bei C{} der Fall, das die Größe Null hat und möglicherweise keinen tatsächlichen Speicher belegt. Stattdessen kann es auf dieselbe Speicheradresse verweisen wie andere Werte der Größe Null, wie z. B. struct{}{}, []int{} oder sogar das leere Array [3]struct{}{}.
Das Verständnis der Feldausrichtung und des Konzepts von Nullgrößenwerten verbessert unser Verständnis der Speicherverwaltung von Go. Durch die strategische Anordnung von Feldern innerhalb einer Struktur können wir die Speicherzuweisung optimieren und eine effiziente Datenbearbeitung sicherstellen.
Das obige ist der detaillierte Inhalt vonWarum haben Go-Strukturen mit denselben Feldern unterschiedliche Größen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!