In Go kann sich die Reihenfolge, in der Strukturfelder deklariert werden, auf die Größe der Struktur auswirken. Warum?
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.
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
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.
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!