Следите за выравниванием полей структур и классов
Выравнивание - это требование к размещению полей структур и классов в памяти, а именно расположение по адресам, кратным их размеру.
Например, int (4 байта на многих архитектурах) должен быть выровнен по адресу, кратному 4. Компилятор автоматически размещает поля (при отсутствии директивы #pragma pack) в структурах, вставляя пустые пространства (padding) между ними, не меняя их порядок.
Это требование необходимо учитывать, чтобы избежать неэффективного использования памяти и снижения производительности из-за дополнительных паддингов (padding).
Неправильно:
struct BadAlignment {
char a; // 1 байт
// padding[3] (3 пустых байта, чтобы выровнять int)
int b; // 4 байта (должен быть выровнен по 4)
char c; // 1 байт
// padding[3] (структура выравнивается по наибольшему полю — int)
};
// Размер = 1 + 3(pad) + 4 + 1 + 3(pad) = 12 байт
Правильно:
struct GoodAlignment {
int b; // 4 байта
char a; // 1 байт
char c; // 1 байт
// padding[2] (структура выравнивается по 4)
};
// Размер = 4 + 1 + 1 + 2(pad) = 8 байт
При написании классов и структур можно использовать простую рекомендацию - располагайте поля в порядке убывания размера. Это гарантирует оптимальное размещение полей в памяти.
Настоятельно не рекомендуется без веских причин использовать директиву #pragma pack, которая может приводить к снижению производительности.