In Go können Strukturen unterschiedliche Größen aufweisen, wenn ihre Felder in unterschiedlicher Reihenfolge angeordnet sind.
type A struct {</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">a bool b int64 c int
}
type B struct {
b int64 a bool c int
}
Beim Ausführen von unsafe.Sizeof (A{}) ist das Ergebnis 24 Bytes, während unsafe.Sizeof(B{}) 16 Bytes druckt. Obwohl die Felder den gleichen Satz haben, führt ihre unterschiedliche Reihenfolge zu dieser Größenvariation.
Die Größen von Strukturen werden durch Ausrichtungsbeschränkungen beeinflusst. int64-Werte erfordern eine Ausrichtung auf 8-Byte-Adressen. In Struktur A werden nach dem Bool-Feld (1 Byte) 7 Byte implizite Auffüllung hinzugefügt, um die Ausrichtung für das folgende int64-Feld (8 Byte) sicherzustellen. Dies erklärt die 24-Byte-Größe.
In Struktur B sind jedoch nur 3 Bytes Auffüllung nach dem Bool-Feld erforderlich, da das Int-Feld nur 4 Bytes groß ist. Somit beträgt die Gesamtgröße 16 Bytes.
type C struct {<br>}<br>
Die Größe von Struktur C ist 0, da sie keine Felder mit einer Größe größer als Null hat. Dies bedeutet jedoch nicht unbedingt, dass für eine Instanz vom Typ C kein Speicher zugewiesen ist.
Gemäß der Go-Spezifikation können Werte der Größe Null Speicheradressen gemeinsam nutzen. Obwohl die Spezifikation die Verwendung derselben Adresse vorschlägt, ist dies keine Voraussetzung. Aktuelle Go-Implementierungen nutzen diese Optimierung, um Speicher für Variablen mit einer Größe von Null zu sparen. Daher kann das System trotz der Größe von C immer noch etwas Speicher für eine Variable vom Typ C zuweisen.
Das obige ist der detaillierte Inhalt vonWarum haben Go-Strukturen je nach Feldreihenfolge unterschiedliche Größen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!