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.
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!