Как работает memory alignment в Go?

Middle+
824 просмотров
AFK Offer AI

Memory alignment — это требование процессора, чтобы данные лежали по адресам, кратным их размеру. int64 должен быть по адресу, кратному 8, int32 — кратному 4. Если нарушить — на некоторых архитектурах будет краш, на x86 — просто медленнее.

Go компилятор автоматически выравнивает поля структур, добавляя padding (пустые байты). Из-за этого порядок полей влияет на размер структуры.

type Bad struct {
    a bool   // 1 байт + 7 padding
    b int64  // 8 байт
    c bool   // 1 байт + 7 padding
}            // итого: 24 байта

type Good struct { b int64 // 8 байт a bool // 1 байт c bool // 1 байт + 6 padding } // итого: 16 байта

Проверить можно через unsafe.Sizeof() и unsafe.Alignof(). Линтер fieldalignment из govet подсказывает оптимальный порядок полей. На практике это важно, когда у тебя миллионы структур в памяти — экономия 8 байт на структуру даёт мегабайты.

Следующий вопрос

Как работает DNS?