Прежде чем ответить, я хотел бы привести некоторые данные из Wiki.
Выравнивание структуры данных - это способ организации данных и доступа к ним в памяти компьютера. Он состоит из двух отдельных, но связанных вопросов: выравнивания данных и заполнения структуры данных .
Когда современный компьютер читает или записывает в адрес памяти, он будет делать это фрагментами размером со слово (например, 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)