Trước khi trả lời, tôi xin cung cấp cho bạn một số dữ liệu từ Wiki
Căn chỉnh cấu trúc dữ liệu là cách dữ liệu được sắp xếp và truy cập trong bộ nhớ máy tính. Nó bao gồm hai vấn đề riêng biệt nhưng có liên quan đến nhau: căn chỉnh dữ liệu và đệm cấu trúc dữ liệu .
Khi một máy tính hiện đại đọc từ hoặc ghi vào một địa chỉ bộ nhớ, nó sẽ thực hiện việc này theo các phần có kích thước từ (ví dụ: phần 4 byte trên hệ thống 32 bit). Căn chỉnh dữ liệu có nghĩa là đặt dữ liệu ở khoảng trống bộ nhớ bằng bội số của kích thước từ, điều này làm tăng hiệu suất của hệ thống do cách CPU xử lý bộ nhớ.
Để căn chỉnh dữ liệu, có thể cần phải chèn một số byte vô nghĩa giữa phần cuối của cấu trúc dữ liệu cuối cùng và phần bắt đầu của phần tiếp theo, đó là phần đệm cấu trúc dữ liệu .
gcc cung cấp chức năng vô hiệu hóa phần đệm cấu trúc. nghĩa là để tránh những byte vô nghĩa này trong một số trường hợp. Hãy xem xét cấu trúc sau:
typedef struct
{
char Data1;
int Data2;
unsigned short Data3;
char Data4;
}sSampleStruct;
sizeof(sSampleStruct)
sẽ là 12 chứ không phải 8. Vì cấu trúc đệm. Theo mặc định, Trong X86, các cấu trúc sẽ được đệm vào căn chỉnh 4 byte:
typedef struct
{
char Data1;
//3-Bytes Added here.
int Data2;
unsigned short Data3;
char Data4;
//1-byte Added here.
}sSampleStruct;
Chúng tôi có thể sử dụng __attribute__((packed, aligned(X)))
để nhấn mạnh khoảng đệm có kích thước (X) cụ thể. X nên là lũy thừa của hai. Tham khảo tại đây
typedef struct
{
char Data1;
int Data2;
unsigned short Data3;
char Data4;
}__attribute__((packed, aligned(1))) sSampleStruct;
vì vậy thuộc tính gcc được chỉ định ở trên không cho phép đệm cấu trúc. vì vậy kích thước sẽ là 8 byte.
Nếu bạn muốn làm điều tương tự cho tất cả các cấu trúc, chỉ cần chúng ta có thể đẩy giá trị căn chỉnh vào ngăn xếp bằng cách sử dụng #pragma
#pragma pack(push, 1)
//Structure 1
......
//Structure 2
......
#pragma pack(pop)