На обычной 64-битной Go-платформе some1 и some3 занимают по 24 байта, some2 — 32 из-за padding. Поэтому по размеру первые два варианта равнозначны и компактнее some2.
// Задача 2: Какой из вариантов более оптимальный?
На обычной 64-битной Go-платформе some1 и some3 занимают по 24 байта, some2 — 32 из-за padding. Поэтому по размеру первые два варианта равнозначны и компактнее some2.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
// Задача 2: Какой из вариантов более оптимальный? type some1 struct{ b int32 a bool c string } type some2 struct{ b int32 c string a bool } type some3 struct{ a bool b int32 c string } // Ваш ответ:
Ответ
На обычной 64-битной Go-платформе some1 и some3 занимают по 24 байта, some2 — 32 из-за padding. Поэтому по размеру первые два варианта равнозначны и компактнее some2.
При выравнивании string на 8 байт его заголовок занимает 16 байт. В some1 bool располагается после int32, затем идёт padding до string. В some3 padding находится между bool и int32. В some2 появляется отступ перед string и хвостовое выравнивание после bool.
Проверьте целевую платформу через unsafe.Sizeof и unsafe.Offsetof. Размер структуры не включает байты содержимого строки. Меньший размер может помочь массивам и кешу, но общую производительность всё равно измеряют в контексте использования.
Источник: pkg.go.dev.