Heim > Backend-Entwicklung > Golang > Warum beeinflusst die Strukturfeldreihenfolge die Größe von Go-Strukturen?

Warum beeinflusst die Strukturfeldreihenfolge die Größe von Go-Strukturen?

Mary-Kate Olsen
Freigeben: 2024-12-21 03:39:09
Original
370 Leute haben es durchsucht

Why Does Struct Field Order Affect the Size of Go Structs?

Unterschiedliche strukturelle Reihenfolge der Felder wirkt sich auf die Größe aus

In Go kann sich die Reihenfolge, in der Strukturfelder deklariert werden, auf die Größe der Struktur auswirken. Warum?

Fallstudie

type A struct {
    a bool
    b int64
    c int
}

type B struct {
    b int64
    a bool
    c int
}
Nach dem Login kopieren

Das Drucken der Größen dieser Strukturen zeigt:

fmt.Println(unsafe.Sizeof(A{})) // Output: 24

fmt.Println(unsafe.Sizeof(B{})) // Output: 16
Nach dem Login kopieren

Obwohl sie die gleichen Felder haben, unterscheiden sich ihre Größen.

Feldausrichtung und Auffüllung

Ob Felder ausgerichtet sind oder an bestimmten Speicheradressen beginnen, hängt davon ab auf der Zielarchitektur. Int64 erfordert beispielsweise eine 8-Byte-Ausrichtung. In A ist das erste Feld bool, also 1 Byte. Um b (int64) korrekt auszurichten, gibt es nach a eine implizite Auffüllung von 7 Byte.

Da in B auf a int (4 Byte) folgt, sind nur 3 Byte Auffüllung erforderlich. Dies erklärt den Größenunterschied.

// Offset (in bytes) for struct A
fmt.Println(unsafe.Offsetof(a.a)) // Output: 0
fmt.Println(unsafe.Offsetof(a.b)) // Output: 8
fmt.Println(unsafe.Offsetof(a.c)) // Output: 16

// Offset for struct B
fmt.Println(unsafe.Offsetof(b.b)) // Output: 0
fmt.Println(unsafe.Offsetof(b.a)) // Output: 8
fmt.Println(unsafe.Offsetof(b.c)) // Output: 12
Nach dem Login kopieren

Strukturen und Variablen mit Nullgröße

type C struct {}
Nach dem Login kopieren

Die Größe einer Struktur mit Nullgröße ist Null, was bedeutet, dass keine Speicherzuweisung erfolgt. Obwohl unterschiedliche Variablen auf Strukturen der Größe Null verweisen, können sie dieselbe Speicheradresse teilen:

a := C{}
b := C{}
c := [0]int{}
d := [3]C{}

fmt.Printf("%p %p %p %p %p", &a, &b, &c, &d, &d[2])
Nach dem Login kopieren

Ausgabe:

0x21cd7c 0x21cd7c 0x21cd7c 0x21cd7c 0x21cd7c
Nach dem Login kopieren

Alle Adressen sind gleich, was darauf hinweist, dass für diese Nullen keine Speicherzuweisung erfolgt -Größenvariablen.

Fazit

Die Reihenfolge der Strukturfelder kann sich aufgrund von Ausrichtungsanforderungen und impliziter Auffüllung auf die Größe auswirken. Strukturen mit der Größe Null optimieren die Speichernutzung, indem sie keinen Speicher zuweisen und möglicherweise dieselbe Adresse für verschiedene Variablen gemeinsam nutzen.

Das obige ist der detaillierte Inhalt vonWarum beeinflusst die Strukturfeldreihenfolge die Größe von Go-Strukturen?. 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 Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage