#pragma pack
สั่งให้คอมไพเลอร์แพ็คสมาชิกโครงสร้างด้วยการจัดตำแหน่งเฉพาะ คอมไพเลอร์ส่วนใหญ่เมื่อคุณประกาศโครงสร้างจะแทรกการเติมระหว่างสมาชิกเพื่อให้แน่ใจว่าพวกเขาถูกจัดตำแหน่งให้สอดคล้องกับที่อยู่ที่เหมาะสมในหน่วยความจำ (โดยปกติจะเป็นขนาดหลายประเภท) สิ่งนี้จะหลีกเลี่ยงการปรับประสิทธิภาพ (หรือข้อผิดพลาดทันที) ในบางสถาปัตยกรรมที่เกี่ยวข้องกับการเข้าถึงตัวแปรที่ไม่ได้รับการจัดแนวอย่างเหมาะสม ตัวอย่างเช่นกำหนดจำนวนเต็ม 4 ไบต์และโครงสร้างต่อไปนี้:
struct Test
{
char AA;
int BB;
char CC;
};
คอมไพเลอร์สามารถเลือกวางโครงสร้างในหน่วยความจำเช่นนี้:
| 1 | 2 | 3 | 4 |
| AA(1) | pad.................. |
| BB(1) | BB(2) | BB(3) | BB(4) |
| CC(1) | pad.................. |
และsizeof(Test)
จะเป็น 4 × 3 = 12 แม้ว่าจะมีข้อมูลเพียง 6 ไบต์เท่านั้น กรณีการใช้งานที่พบบ่อยที่สุดสำหรับ#pragma
(ความรู้ของฉัน) คือเมื่อทำงานกับอุปกรณ์ฮาร์ดแวร์ที่คุณต้องให้แน่ใจว่าคอมไพเลอร์ไม่ได้แทรกการเติมลงในข้อมูลและสมาชิกแต่ละคนจะติดตามก่อนหน้านี้ ด้วย#pragma pack(1)
โครงสร้างข้างต้นจะถูกวางแบบนี้:
| 1 |
| AA(1) |
| BB(1) |
| BB(2) |
| BB(3) |
| BB(4) |
| CC(1) |
และsizeof(Test)
จะเป็น 1 × 6 = 6
ด้วย#pragma pack(2)
โครงสร้างข้างต้นจะถูกวางแบบนี้:
| 1 | 2 |
| AA(1) | pad.. |
| BB(1) | BB(2) |
| BB(3) | BB(4) |
| CC(1) | pad.. |
และsizeof(Test)
จะเป็น 2 × 4 = 8
ลำดับของตัวแปรใน struct ก็มีความสำคัญเช่นกัน ด้วยตัวแปรที่เรียงลำดับดังนี้:
struct Test
{
char AA;
char CC;
int BB;
};
และด้วย#pragma pack(2)
โครงสร้างจะถูกวางไว้เช่นนี้:
| 1 | 2 |
| AA(1) | CC(1) |
| BB(1) | BB(2) |
| BB(3) | BB(4) |
และsizeOf(Test)
จะเป็น 3 × 2 = 6
#pragma
คำสั่งทั้งหมดที่พวกเขากำลังดำเนินการที่กำหนดไว้