#pragma pack
hướng dẫn trình biên dịch để đóng gói các thành viên cấu trúc với sự liên kết cụ thể. Hầu hết các trình biên dịch, khi bạn khai báo một cấu trúc, sẽ chèn phần đệm giữa các thành viên để đảm bảo rằng chúng được căn chỉnh theo các địa chỉ phù hợp trong bộ nhớ (thường là bội số của kích thước loại). Điều này tránh được hình phạt hiệu suất (hoặc lỗi hoàn toàn) trên một số kiến trúc liên quan đến việc truy cập các biến không được căn chỉnh chính xác. Ví dụ, đã cho các số nguyên 4 byte và cấu trúc sau:
struct Test
{
char AA;
int BB;
char CC;
};
Trình biên dịch có thể chọn đặt cấu trúc ra trong bộ nhớ như thế này:
| 1 | 2 | 3 | 4 |
| AA(1) | pad.................. |
| BB(1) | BB(2) | BB(3) | BB(4) |
| CC(1) | pad.................. |
và sizeof(Test)
sẽ là 4 × 3 = 12, mặc dù nó chỉ chứa 6 byte dữ liệu. Trường hợp sử dụng phổ biến nhất cho #pragma
(theo hiểu biết của tôi) là khi làm việc với các thiết bị phần cứng, nơi bạn cần đảm bảo rằng trình biên dịch không chèn phần đệm vào dữ liệu và mỗi thành viên tuân theo quy tắc trước đó. Với #pragma pack(1)
, cấu trúc trên sẽ được trình bày như thế này:
| 1 |
| AA(1) |
| BB(1) |
| BB(2) |
| BB(3) |
| BB(4) |
| CC(1) |
Và sizeof(Test)
sẽ là 1 × 6 = 6.
Với #pragma pack(2)
, cấu trúc trên sẽ được trình bày như thế này:
| 1 | 2 |
| AA(1) | pad.. |
| BB(1) | BB(2) |
| BB(3) | BB(4) |
| CC(1) | pad.. |
Và sizeof(Test)
sẽ là 2 × 4 = 8.
Thứ tự các biến trong struct cũng rất quan trọng. Với các biến được sắp xếp như sau:
struct Test
{
char AA;
char CC;
int BB;
};
và với #pragma pack(2)
, cấu trúc sẽ được đặt ra như thế này:
| 1 | 2 |
| AA(1) | CC(1) |
| BB(1) | BB(2) |
| BB(3) | BB(4) |
và sizeOf(Test)
sẽ là 3 × 2 = 6.
#pragma
chỉ thị mà chúng được thực hiện được xác định.