Setiap kompiler C menawarkan opsi untuk "mengemas" struktur C (misalnya __attribute__ ((__packed__))
, atau #pragma pack()
). Sekarang, kita semua tahu bahwa pengemasan diperlukan, jika kita ingin mengirim atau menyimpan data dengan cara yang andal. Ini juga harus menjadi persyaratan sejak hari pertama bahasa C.
Jadi saya bertanya-tanya mengapa struktur yang dikemas bukan bagian dari spesifikasi bahasa C? Mereka bahkan tidak di C99 atau C11 meskipun keharusan memiliki mereka dikenal selama beberapa dekade sekarang? Apa yang saya lewatkan? Mengapa ini khusus untuk kompiler?
Jawaban:
Saya kira itu karena itu tergantung pada kombinasi target CPU / compiler yang digunakan. Ini berarti bahwa lebih baik menjadi arahan kompiler (karena ini terkait dengan itu) daripada aspek bahasa, karena bagaimana menentukannya? Satu-satunya cara mereka bisa melakukannya adalah dengan persatuan.
Artikel Raymond memberikan beberapa wawasan mengapa ini adalah: http://www.catb.org/esr/structure-packing/
sumber
Ada tiga faktor utama.
Dengan mempertimbangkan faktor-faktor ini, standar dan semua kompiler C / C ++ secara rutin membuat struktur pad untuk memastikan keselarasan optimal untuk prosesor, tetapi juga menyediakan mekanisme untuk menimpanya jika diperlukan untuk keperluan interop.
Ini sama sekali bukan sesuatu yang telah diabaikan. Ini sangat dipahami dengan baik dan situasi saat ini adalah dengan desain. Versi terbaru dari standar C ++ memiliki dukungan luas untuk menangani masalah penyelarasan, yang mungkin tidak Anda kenal.
sumber
Ini adalah compiler-spesifik karena tidak dalam standar. Dan itu tidak dalam standar karena akan sulit untuk menentukan dengan cara yang tidak akan membutuhkan banyak upaya implementasi untuk kompiler dari platform yang tidak jelas dengan pembatasan penyelarasan yang dipaksakan.
Dan tidak ada upaya yang memiliki banyak pembenaran, karena setiap kompiler / platform yang digunakan oleh siapa pun yang menggunakan kompiler C89 atau yang lebih baru sudah menerapkannya.
sumber
&
/|
operasi yang diperlukan untuk membaca / menulis nilai-nilai setiap bidang.