Выравнивание структур С++ в памяти

Процессор получает данные из памяти через шину данных (data bus). Одно чтение данных из шины называется циклом (cycle). Компилятор С++ оптимизирует размещение данных в памяти, для минимизации числа циклов. Подробнее про циклы и их связь с выравниванием можно прочитать в статье Structure member alignment padding and data packing.

Пример выравнивания структуры:

typedef struct A
{
    char c;
    int n;
    short s;
} A_t;
Natural data alignment

Для минимизации числа циклов чтения, адреса данных в памяти должны быть выровнены кратно размеру данных.

Тип Выравнивание
char 1
int 4
float 4
double 8
Structure padding

Компилятор С++ применяет ***natural data alignment*** ко всем полям в структуре. Для этого, перед полем может быть добавлено выравнивающее адрес padding-поле.

Дополнительно, размер структуры выравнивается кратно размеру самого большого поля. Это необходимо для минимизации количества циклов, когда структура размещается в массиве. Для этого padding-поле добавляется в конец структуры.

Structure packing

При работе с памятью выравнивание структуры может усложнять код. В таком случае выравнивание можно отключить при помощи директивы компилятора.

#pragma pack(1)

Альтернативный способ, это читать память по одному байту. Такой способ позволяет избежать выравнивания структур, но может быть не самым оптимальным по скорости.