Перш ніж відповісти, я хотів би надати вам деякі дані з Вікі
Вирівнювання структури даних - це спосіб упорядкування та доступу до даних у пам'яті комп'ютера. Він складається з двох окремих, але пов’язаних із цим питань: вирівнювання даних та доповнення структури даних .
Коли сучасний комп’ютер читає або записує на адресу пам'яті, він буде робити це в шматки розміру слова (наприклад, 4 байтні фрагменти в 32-бітній системі). Вирівнювання даних означає приведення даних у зсув пам'яті, рівний деякому кратному розміру слова, що збільшує продуктивність системи завдяки тому, як процесор обробляє пам'ять.
Для вирівнювання даних може знадобитися вставити кілька безглуздих байтів між кінцем останньої структури даних та початком наступної, що є вкладкою структури даних .
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)