cari
Rumahpembangunan bahagian belakangGolangMengapa Go Structs dengan Medan yang Sama Mempunyai Saiz Berbeza?

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

}

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?

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.

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!

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
Bagaimana saya menulis objek dan stub untuk ujian di GO?Bagaimana saya menulis objek dan stub untuk ujian di GO?Mar 10, 2025 pm 05:38 PM

Artikel ini menunjukkan penciptaan dan stub di GO untuk ujian unit. Ia menekankan penggunaan antara muka, menyediakan contoh pelaksanaan mengejek, dan membincangkan amalan terbaik seperti menjaga mocks fokus dan menggunakan perpustakaan penegasan. Articl

Bagaimana saya boleh menentukan kekangan jenis tersuai untuk generik di GO?Bagaimana saya boleh menentukan kekangan jenis tersuai untuk generik di GO?Mar 10, 2025 pm 03:20 PM

Artikel ini meneroka kekangan jenis adat Go untuk generik. Ia memperincikan bagaimana antara muka menentukan keperluan jenis minimum untuk fungsi generik, meningkatkan keselamatan jenis dan kebolehgunaan semula kod. Artikel ini juga membincangkan batasan dan amalan terbaik

Bagaimana anda menulis ujian unit di GO?Bagaimana anda menulis ujian unit di GO?Mar 21, 2025 pm 06:34 PM

Artikel ini membincangkan ujian unit menulis di GO, meliputi amalan terbaik, teknik mengejek, dan alat untuk pengurusan ujian yang cekap.

Bagaimana saya boleh menggunakan alat pengesanan untuk memahami aliran pelaksanaan aplikasi saya?Bagaimana saya boleh menggunakan alat pengesanan untuk memahami aliran pelaksanaan aplikasi saya?Mar 10, 2025 pm 05:36 PM

Artikel ini meneroka menggunakan alat pengesanan untuk menganalisis aliran pelaksanaan aplikasi GO. Ia membincangkan teknik instrumentasi manual dan automatik, membandingkan alat seperti Jaeger, Zipkin, dan OpenTelemetry, dan menonjolkan visualisasi data yang berkesan

Bagaimana anda menggunakan alat PPROF untuk menganalisis prestasi GO?Bagaimana anda menggunakan alat PPROF untuk menganalisis prestasi GO?Mar 21, 2025 pm 06:37 PM

Artikel ini menerangkan cara menggunakan alat PPROF untuk menganalisis prestasi GO, termasuk membolehkan profil, mengumpul data, dan mengenal pasti kesesakan biasa seperti CPU dan isu memori.

Terangkan tujuan Pakej Refleksi Go. Bilakah anda akan menggunakan refleksi? Apakah implikasi prestasi?Terangkan tujuan Pakej Refleksi Go. Bilakah anda akan menggunakan refleksi? Apakah implikasi prestasi?Mar 25, 2025 am 11:17 AM

Artikel ini membincangkan pakej GO's Reflect, yang digunakan untuk manipulasi kod runtime, bermanfaat untuk siri, pengaturcaraan generik, dan banyak lagi. Ia memberi amaran tentang kos prestasi seperti pelaksanaan yang lebih perlahan dan penggunaan memori yang lebih tinggi, menasihati penggunaan yang bijak dan terbaik

Bagaimana anda menentukan kebergantungan dalam fail go.mod anda?Bagaimana anda menentukan kebergantungan dalam fail go.mod anda?Mar 27, 2025 pm 07:14 PM

Artikel ini membincangkan menguruskan kebergantungan modul Go melalui Go.Mod, meliputi spesifikasi, kemas kini, dan resolusi konflik. Ia menekankan amalan terbaik seperti versi semantik dan kemas kini biasa.

Bagaimana anda menggunakan ujian yang didorong oleh jadual di GO?Bagaimana anda menggunakan ujian yang didorong oleh jadual di GO?Mar 21, 2025 pm 06:35 PM

Artikel ini membincangkan menggunakan ujian yang didorong oleh jadual di GO, satu kaedah yang menggunakan jadual kes ujian untuk menguji fungsi dengan pelbagai input dan hasil. Ia menyoroti faedah seperti kebolehbacaan yang lebih baik, penurunan duplikasi, skalabiliti, konsistensi, dan a

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Alat panas

Dreamweaver Mac版

Dreamweaver Mac版

Alat pembangunan web visual

Muat turun versi mac editor Atom

Muat turun versi mac editor Atom

Editor sumber terbuka yang paling popular

Versi Mac WebStorm

Versi Mac WebStorm

Alat pembangunan JavaScript yang berguna

VSCode Windows 64-bit Muat Turun

VSCode Windows 64-bit Muat Turun

Editor IDE percuma dan berkuasa yang dilancarkan oleh Microsoft

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma