Rumah > pembangunan bahagian belakang > Golang > Mengapa Go Structs dengan Medan yang Sama Mempunyai Saiz Berbeza?

Mengapa Go Structs dengan Medan yang Sama Mempunyai Saiz Berbeza?

Linda Hamilton
Lepaskan: 2024-12-18 16:18:10
asal
755 orang telah melayarinya

Why Do Go Structs with the Same Fields Have Different Sizes?

Pemesanan dan Saiz Medan Struktur

Kod yang disediakan menunjukkan tingkah laku yang menarik:


struktur jenis A {

a bool
b int64
c int
Salin selepas log masuk

}

jenis B struct {

b int64
a bool
c int
Salin selepas log masuk

}

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?

Penjajaran Medan

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?

Nilai Saiz Sifar

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{}{}.

Kesimpulan

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan