Процессор получает данные из памяти через шину данных (data bus). Одно чтение данных из шины называется циклом (cycle). Компилятор С++ оптимизирует размещение данных в памяти, для минимизации числа циклов. Подробнее про циклы и их связь с выравниванием можно прочитать в статье Structure member alignment padding and data packing.
Пример выравнивания структуры:
typedef struct A
{
char c;
int n;
short s;
} A_t;
Для минимизации числа циклов чтения, адреса данных в памяти должны быть выровнены кратно размеру данных.
| Тип | Выравнивание |
|---|---|
| char | 1 |
| int | 4 |
| float | 4 |
| double | 8 |
Компилятор С++ применяет ***natural data alignment*** ко всем полям в структуре. Для этого, перед полем может быть добавлено выравнивающее адрес padding-поле.
Дополнительно, размер структуры выравнивается кратно размеру самого большого поля. Это необходимо для минимизации количества циклов, когда структура размещается в массиве. Для этого padding-поле добавляется в конец структуры.
При работе с памятью выравнивание структуры может усложнять код. В таком случае выравнивание можно отключить при помощи директивы компилятора.
#pragma pack(1)
Альтернативный способ, это читать память по одному байту. Такой способ позволяет избежать выравнивания структур, но может быть не самым оптимальным по скорости.