Kod yang disediakan menunjukkan tingkah laku yang menarik:
struktur jenis A {
a bool b int64 c int
}
jenis B struct {
b int64 a bool c int
}
Apabila mencetak saiz A{} dan B{} menggunakan tidak selamat.Sizeof, kami memperoleh yang mengejutkan hasil:
fmt.Println(unsafe.Sizeof(A{})) // Output: 24
fmt.Println(unsafe.Sizeof(B{})) / / Output: 16
Mengapa adakah struct ini mempunyai saiz yang berbeza walaupun mempunyai medan yang sama?
Jawapannya terletak pada penjajaran medan. Dalam Go, alamat pembolehubah mesti diselaraskan berdasarkan jenisnya dan penjajaran ini amat penting untuk jenis seperti int64 (penjajaran 8 bait). Dalam kes A, medan pertama a ialah bool, yang memerlukan hanya 1 bait storan. Selepas medan ini, terdapat padding tersirat 7-bait untuk menjajarkan medan seterusnya b (jenis int64) pada sempadan 8-bait. Walau bagaimanapun, dalam kes B, memandangkan medan pertama b sudah dijajarkan pada sempadan 8 bait, tidak ada keperluan untuk sebarang padding tersirat, menghasilkan saiz struktur yang lebih kecil iaitu 16 bait.
< h3>Saiz Struktur Kosong
Seterusnya, kita akan menemui satu lagi yang menarik kes:
struktur jenis C {
}
Apabila mencetak tidak selamat.Saiz(C{}), kami secara tidak dijangka dapatkan output 0. Bagaimanakah ini boleh dilakukan, memandangkan setiap struct menduduki beberapa memori?
Spesifikasi Go menyatakan bahawa struktur atau tatasusunan tanpa medan atau elemen dengan saiz lebih besar daripada sifar mempunyai saiz sifar. Ia juga membayangkan bahawa dua pembolehubah saiz sifar yang berbeza mungkin berkongsi alamat memori yang sama. Ini adalah kes dengan C{}, yang mempunyai saiz sifar dan mungkin tidak menduduki sebarang memori sebenar. Sebaliknya, ia boleh merujuk alamat memori yang sama seperti nilai saiz sifar yang lain, seperti struct{}{}, []int{}, atau juga tatasusunan kosong [3]struct{}{}.
Memahami penjajaran medan dan konsep nilai saiz sifar meningkatkan pemahaman kita tentang Pengurusan ingatan Go. Dengan menyusun medan secara strategik dalam struktur, kami boleh mengoptimumkan peruntukan memori dan memastikan manipulasi data yang cekap.
Atas ialah kandungan terperinci Mengapa Go Structs dengan Medan yang Sama Mempunyai Saiz Berbeza?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!