Что такое memory alignment?

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

Процессор читает память блоками (4 или 8 байт). Если переменная не выровнена по границе — доступ медленнее или вообще невозможен (на некоторых архитектурах).

Go автоматически добавляет padding между полями структуры:

// Плохо: 24 байта (padding между полями)
type Bad struct {
    a bool    // 1 байт + 7 padding
    b int64   // 8 байт
    c bool    // 1 байт + 7 padding
}

// Хорошо: 16 байт (поля отсортированы по размеру) type Good struct { b int64 // 8 байт a bool // 1 байт c bool // 1 байт + 6 padding }

Проверка:

fmt.Println(unsafe.Sizeof(Bad{}))   // 24
fmt.Println(unsafe.Sizeof(Good{}))  // 16

Правило: сортируй поля от большего к меньшему. Инструмент fieldalignment (часть go vet) автоматически находит неоптимальные структуры:

go vet -fieldalignment ./...

На практике важно только для структур, создаваемых миллионами (кеши, буферы, частицы). Для обычных бизнес-объектов — не парься.

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

Как экспортировать функцию в Go?