Rumah >pembangunan bahagian belakang >Golang >Mengapa Pesanan Medan Berbeza dalam Go Structs Menghasilkan Pelbagai Saiz?

Mengapa Pesanan Medan Berbeza dalam Go Structs Menghasilkan Pelbagai Saiz?

Susan Sarandon
Susan Sarandonasal
2024-12-05 01:36:10470semak imbas

Why Do Different Field Orders in Go Structs Result in Varying Sizes?

Struct mempunyai saiz yang berbeza jika susunan medan berbeza

1. Saiz struktur

Ringkasan: Pelapik tersirat yang berbeza ditambah bergantung pada susunan medan dalam struct, yang mempengaruhi saiznya.

Seni bina yang berbeza memerlukan penjajaran yang berbeza untuk ingatan alamat. Contohnya, dalam kod yang disediakan, diandaikan bahawa seni bina sasaran ialah 386, dengan alignof int64 ialah 8 bait.

Dalam struct A, memandangkan medan pertama ialah bool, terdapat padding tersirat 7-bait selepas A.a untuk memastikan bahawa A.b, yang jenis int64, bermula pada alamat sejajar 8 bait. Pelapik ini diperlukan kerana struct itu sendiri diselaraskan dengan 8 bait.

Dalam struct B, walau bagaimanapun, hanya terdapat pelapik tersirat 3-bait selepas B.a kerana ia diikuti oleh medan jenis int (yang mempunyai saiz 4 bait) dan bukan int64.

2. Nilai saiz sifar

Spesifikasi untuk Go menyatakan bahawa struktur atau jenis tatasusunan mempunyai saiz sifar jika ia tidak mengandungi medan atau elemen yang mempunyai saiz lebih besar daripada sifar.

Ini bermakna sifar yang berbeza- pembolehubah saiz mungkin mempunyai alamat yang sama dalam ingatan. Pelaksanaan semasa mengikut peraturan ini, jadi tiada memori diperuntukkan untuk nilai jenis yang mempunyai saiz sifar, termasuk struct struct kosong{} dan tatasusunan panjang sifar.

Sebagai contoh, dalam kod yang disediakan, C ialah struct bersaiz sifar. Akibatnya, tiada memori diperuntukkan untuk contoh C.

Atas ialah kandungan terperinci Mengapa Pesanan Medan Berbeza dalam Go Structs Menghasilkan Pelbagai Saiz?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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