5
__attribute __ ของ gcc เป็น (บรรจุแล้ว) / #pragma ไม่ปลอดภัยหรือไม่
ใน C คอมไพเลอร์จะวางโครงสมาชิกของโครงสร้างตามลำดับที่ประกาศโดยมีการเติมไบต์ที่เป็นไปได้แทรกระหว่างสมาชิกหรือหลังสมาชิกรายสุดท้ายเพื่อให้แน่ใจว่าสมาชิกแต่ละคนได้รับการจัดตำแหน่งอย่างถูกต้อง gcc จัดเตรียมส่วนขยายของภาษา__attribute__((packed))ซึ่งบอกคอมไพเลอร์ว่าไม่ให้แทรกการซ้อนทำให้สมาชิกโครงสร้างไม่ถูกต้อง ตัวอย่างเช่นถ้าระบบต้องการintวัตถุทั้งหมดที่มีการจัดตำแหน่งแบบ 4 ไบต์__attribute__((packed))สามารถทำให้intสมาชิก struct ได้รับการจัดสรรที่ออฟเซ็ตแปลก ๆ การอ้างอิงเอกสาร gcc: แอตทริบิวต์ `ที่บรรจุ 'ระบุว่าเขตข้อมูลตัวแปรหรือโครงสร้างควรมีการจัดตำแหน่งที่เล็กที่สุดที่เป็นไปได้ - หนึ่งไบต์สำหรับตัวแปรและหนึ่งบิตสำหรับเขตข้อมูลเว้นแต่ว่าคุณจะระบุค่าที่มากขึ้นด้วยแอตทริบิวต์` จัดชิด' เห็นได้ชัดว่าการใช้ส่วนขยายนี้อาจส่งผลให้ข้อกำหนดด้านข้อมูลมีขนาดเล็กลง แต่มีโค้ดที่ช้ากว่าเนื่องจากคอมไพเลอร์จะต้องสร้างรหัสเพื่อเข้าถึงสมาชิกไบต์ที่ไม่ถูกต้องในแต่ละครั้ง แต่มีกรณีใดบ้างที่สิ่งนี้ไม่ปลอดภัยหรือไม่? คอมไพเลอร์สร้างรหัสที่ถูกต้อง (แม้ว่าช้ากว่า) เสมอเพื่อเข้าถึงสมาชิกที่มีโครงสร้างไม่ตรงตามที่กำหนดหรือไม่? เป็นไปได้ไหมที่จะทำเช่นนั้นในทุกกรณี?
164
c
gcc
pragma-pack