ก่อนที่จะตอบฉันต้องการให้ข้อมูลบางส่วนจาก Wiki
การจัดตำแหน่งโครงสร้างข้อมูลเป็นวิธีการจัดเรียงและเข้าถึงข้อมูลในหน่วยความจำคอมพิวเตอร์ ประกอบด้วยสองแยกประเด็น แต่ที่เกี่ยวข้องกับการจัดเรียงข้อมูลและโครงสร้างข้อมูล padding
เมื่อคอมพิวเตอร์สมัยใหม่อ่านหรือเขียนไปยังที่อยู่หน่วยความจำคอมพิวเตอร์จะทำสิ่งนี้เป็นชิ้นขนาดคำ (เช่นชิ้นส่วนขนาด 4 ไบต์ในระบบ 32 บิต) การจัดแนวข้อมูลหมายถึงการวางข้อมูลที่ออฟเซ็ตหน่วยความจำเท่ากับผลคูณของขนาดคำซึ่งจะเพิ่มประสิทธิภาพของระบบเนื่องจากวิธีที่ CPU จัดการกับหน่วยความจำ
เพื่อให้สอดคล้องข้อมูลก็อาจจะจำเป็นต้องใส่ไบต์ความหมายบางอย่างระหว่างการสิ้นสุดของโครงสร้างข้อมูลล่าสุดและการเริ่มต้นของการต่อไปซึ่งเป็นโครงสร้างข้อมูล padding
gcc มีฟังก์ชันในการปิดการใช้งานช่องว่างภายในโครงสร้าง คือหลีกเลี่ยงไบต์ที่ไร้ความหมายเหล่านี้ในบางกรณี พิจารณาโครงสร้างต่อไปนี้:
typedef struct
{
char Data1;
int Data2;
unsigned short Data3;
char Data4;
}sSampleStruct;
sizeof(sSampleStruct)
จะเป็น 12 แทนที่จะเป็น 8 เนื่องจากโครงสร้างภายใน ตามค่าเริ่มต้นใน X86 โครงสร้างจะได้รับการจัดตำแหน่ง 4 ไบต์:
typedef struct
{
char Data1;
//3-Bytes Added here.
int Data2;
unsigned short Data3;
char Data4;
//1-byte Added here.
}sSampleStruct;
เราสามารถใช้__attribute__((packed, aligned(X)))
เพื่อยืนยันช่องว่างขนาด (X) โดยเฉพาะ X ควรเป็นกำลังสอง อ้างอิงที่นี่
typedef struct
{
char Data1;
int Data2;
unsigned short Data3;
char Data4;
}__attribute__((packed, aligned(1))) sSampleStruct;
ดังนั้นแอตทริบิวต์ gcc ที่ระบุข้างต้นจึงไม่อนุญาตให้มีการเว้นโครงสร้าง ดังนั้นขนาดจะเป็น 8 ไบต์
หากคุณต้องการทำเช่นเดียวกันสำหรับโครงสร้างทั้งหมดเพียงแค่เราสามารถผลักดันค่าการจัดตำแหน่งให้ซ้อนกันโดยใช้ #pragma
#pragma pack(push, 1)
//Structure 1
......
//Structure 2
......
#pragma pack(pop)