Heim > Backend-Entwicklung > Golang > Warum haben Go-Strukturen mit denselben Feldern unterschiedliche Größen?

Warum haben Go-Strukturen mit denselben Feldern unterschiedliche Größen?

Linda Hamilton
Freigeben: 2024-12-18 16:18:10
Original
752 Leute haben es durchsucht

Why Do Go Structs with the Same Fields Have Different Sizes?

Struct Field Ordering and Size

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
Nach dem Login kopieren

}

Typ-B-Struktur {

b int64
a bool
c int
Nach dem Login kopieren

}

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?

Feldausrichtung

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?

Nullgrößenwerte

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{}{}.

Fazit

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage