Sebelum menjawab, saya ingin memberikan beberapa data dari Wiki
Penyelarasan struktur data adalah cara data disusun dan diakses dalam memori komputer. Ini terdiri dari dua masalah yang terpisah namun terkait: penyelarasan data dan bantalan struktur data .
Ketika komputer modern membaca dari atau menulis ke alamat memori, komputer akan melakukan ini dalam potongan berukuran word (misalnya potongan 4 byte pada sistem 32-bit). Penyelarasan data berarti meletakkan data pada offset memori yang sama dengan beberapa ukuran kata, yang meningkatkan kinerja sistem karena cara CPU menangani memori.
Untuk menyelaraskan data, mungkin perlu untuk memasukkan beberapa byte yang tidak berarti antara akhir dari struktur data terakhir dan awal dari yang berikutnya, yaitu bantalan struktur data .
gcc menyediakan fungsionalitas untuk menonaktifkan padding struktur. yaitu untuk menghindari byte yang tidak berarti ini dalam beberapa kasus. Pertimbangkan struktur berikut:
typedef struct
{
char Data1;
int Data2;
unsigned short Data3;
char Data4;
}sSampleStruct;
sizeof(sSampleStruct)
akan menjadi 12 daripada 8. Karena bantalan struktur. Secara default, Di X86, struktur akan dimasukkan ke penyelarasan 4-byte:
typedef struct
{
char Data1;
//3-Bytes Added here.
int Data2;
unsigned short Data3;
char Data4;
//1-byte Added here.
}sSampleStruct;
Kita dapat menggunakan __attribute__((packed, aligned(X)))
untuk meminta bantalan berukuran (X) tertentu. X harus menjadi pangkat dua. Lihat di sini
typedef struct
{
char Data1;
int Data2;
unsigned short Data3;
char Data4;
}__attribute__((packed, aligned(1))) sSampleStruct;
jadi atribut gcc yang ditentukan di atas tidak mengizinkan bantalan struktur. jadi ukurannya akan menjadi 8 byte.
Jika Anda ingin melakukan hal yang sama untuk semua struktur, cukup kita dapat mendorong nilai alignment ke stack menggunakan #pragma
#pragma pack(push, 1)
//Structure 1
......
//Structure 2
......
#pragma pack(pop)