В Go важно понимать, как компилятор размещает данные в памяти - это напрямую влияет на скорость работы и объём используемой памяти.
Что такое выравнивание?
Выравнивание памяти - это правило: данные должны находиться по адресам, кратным их размеру. Это нужно, чтобы процессор мог читать и записывать значения за одну операцию.
Например:
-
int64 требует выравнивания по 8 байтам -
int32 - по 4 байтам -
byte - по 1 байту Если значение лежит “неудобно”, CPU делает несколько операций вместо одной - это медленнее.
Почему появляется padding
Компилятор Go автоматически вставляет пустые байты (padding) между полями структуры, чтобы соблюсти правила выравнивания.
Размер структуры - это не просто сумма размеров полей.
Пример:
type Example struct {
a byte // 1 байт
b int64 // 8 байт (нужно выравнивание по 8)
c byte // 1 байт
}
Хотя “полезных” данных тут 10 байт, структура занимает больше из-за вставленного паддинга.
Почему это важно
Если структура используется миллионы раз (в кэше, массивах, базах, сетевых пакетах), лишние байты превращаются в:
• большее потребление памяти
• худшее попадание в CPU cache
• падение производительности
Как оптимизировать
• Порядок полей имеет значение.
• Крупные типы лучше ставить первыми:
type Optimized struct {
b int64
a byte
c byte
}
Так компилятору нужно меньше padding, и структура становится компактнее.
Главное правило
В Go порядок полей в структуре влияет на производительность.
Выравнивание памяти - это не микроскопическая оптимизация.
В высоконагруженных системах это даёт реальный прирост скорости и экономию памяти.
Сохрани себе - пригодится при проектировании структур данных.
Больше примеров
