Heim > Backend-Entwicklung > Golang > Warum haben Go-Strukturen je nach Feldreihenfolge unterschiedliche Größen?

Warum haben Go-Strukturen je nach Feldreihenfolge unterschiedliche Größen?

DDD
Freigeben: 2024-12-08 14:20:15
Original
906 Leute haben es durchsucht

Why Do Go Structs Have Different Sizes Depending on Field Order?

Diskrepanz bei der Strukturgröße bei der Neuordnung von Feldern

In Go können Strukturen unterschiedliche Größen aufweisen, wenn ihre Felder in unterschiedlicher Reihenfolge angeordnet sind.

Problem 1: Fehlerhafte Strukturgrößen

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

}

type B struct {

b int64
a bool
c int
Nach dem Login kopieren

}

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.

Erklärung: Implizites Auffüllen

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.

Problem 2: Zero-Sized Struct C

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.

Erklärung: Implementierungsoptimierung

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!

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
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage