Библиотека Go (Golang) разработчика
2.71K subscribers
312 photos
102 videos
29 files
389 links
Полезные материалы по всему, что может быть полезно Golang разработчику. По всем вопросам @evgenycarter
Download Telegram
Memory Alignment: Когда порядок полей стоит гигабайты

Часто при проектировании структур мы группируем поля логически: ID рядом с Name, флаги рядом с конфигами. Но с точки зрения железа и аллокатора Go - это может быть расточительством.

Для Senior-разработчика понимание padding (отступов) и alignment (выравнивания) - мастхэв, особенно в HighLoad проектах, где крутятся миллионы объектов в памяти.

🔍CPU читает память машинными словами (обычно 64 бита / 8 байт). Чтобы доступ был атомарным и быстрым, компилятор Go выравнивает поля по адресам, кратным их размеру. Если поля идут в «неудачном» порядке, компилятор вставляет пустые байты (padding).

Сравним две структуры:


// Bad layout
type BadStruct struct {
Flag bool // 1 byte
// +7 bytes padding
Counter int64 // 8 bytes
Active bool // 1 byte
// +7 bytes padding (для выравнивания всей структуры)
}
// Итог: 24 байта (Sizeof)




// Good layout
type GoodStruct struct {
Counter int64 // 8 bytes
Flag bool // 1 byte
Active bool // 1 byte
// +6 bytes padding
}
// Итог: 16 байт (Sizeof)



📉 Кажется, что 8 байт разницы - ерунда. Но:

1. Масштаб: Если у вас слайс из 10 миллионов таких структур, вы экономите ~76 МБ RAM просто переставив поля.
2. CPU Cache & Spatial Locality: Меньший размер структуры = больше структур влезает в кэш-линию процессора (обычно 64 байта). Это снижает Cache Miss rate и ускоряет итерацию по слайсам.

🛠 Не нужно считать байты в уме.
Используйте fieldalignment из официальных тулзов:


go install golang.org/x/tools/go/analysis/passes/fieldalignment/cmd/fieldalignment@latest
fieldalignment -fix ./...



Внимание: -fix может нарушить вашу «логическую» группировку полей и добавить комментарии, так что используйте с умом (или добавьте в линтер как варнинг).


💡 В Go 1.20+ и новее аллокатор стал умнее, но физику не обманешь. Если вы пишете под архитектуры с жестким выравниванием (например, ARM или WASM), игнорирование alignment может привести не просто к оверхеду, а к панике при атомарных операциях (хотя Go старается это хэндлить).

#golang #optimization #architecture #memory

👉 @golang_lib
🔥9