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
Mary-Kate OlsenOriginal
2024-12-21 03:39:09371Durchsuche

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
}

Das Drucken der Größen dieser Strukturen zeigt:

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

fmt.Println(unsafe.Sizeof(B{})) // Output: 16

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

Strukturen und Variablen mit Nullgröße

type C struct {}

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])

Ausgabe:

0x21cd7c 0x21cd7c 0x21cd7c 0x21cd7c 0x21cd7c

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!

Stellungnahme:
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