Dalam Go, susunan medan struct diisytiharkan boleh menjejaskan saiz struct. Mengapa?
type A struct { a bool b int64 c int } type B struct { b int64 a bool c int }
Mencetak saiz struktur ini mendedahkan:
fmt.Println(unsafe.Sizeof(A{})) // Output: 24 fmt.Println(unsafe.Sizeof(B{})) // Output: 16
Walaupun ia mempunyai medan yang sama, saiznya berbeza.
Sama ada medan diselaraskan atau bermula pada alamat memori tertentu bergantung pada seni bina sasaran. Sebagai contoh, int64 memerlukan penjajaran 8-bait. Dalam A, medan pertama ialah bool, iaitu 1 bait. Untuk menjajarkan b (int64) dengan betul, terdapat padding tersirat 7-bait selepas a.
Dalam B, memandangkan a diikuti oleh int (4 bait), hanya 3 bait padding diperlukan. Ini menerangkan perbezaan saiz.
// 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 {}
Saiz struct bersaiz sifar ialah sifar, menunjukkan tiada peruntukan memori. Walaupun pembolehubah berbeza merujuk struct bersaiz sifar, ia mungkin berkongsi alamat memori yang sama:
a := C{} b := C{} c := [0]int{} d := [3]C{} fmt.Printf("%p %p %p %p %p", &a, &b, &c, &d, &d[2])
Output:
0x21cd7c 0x21cd7c 0x21cd7c 0x21cd7c 0x21cd7c
Semua alamat adalah sama, menunjukkan tiada peruntukan memori untuk sifar ini -pembolehubah saiz.
Pemesanan medan struktur boleh memberi kesan kepada saiz disebabkan keperluan penjajaran dan padding tersirat. Struktur bersaiz sifar mengoptimumkan penggunaan memori dengan tidak memperuntukkan memori dan berkemungkinan berkongsi alamat yang sama untuk pembolehubah yang berbeza.
Atas ialah kandungan terperinci Mengapa Susunan Medan Struct Mempengaruhi Saiz Go Structs?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!