Ответ
SBO — это оптимизация, позволяющая избежать аллокации в куче для небольших объектов, храня их непосредственно внутри структуры. В Go это часто реализуется через встраивание массива фиксированного размера.
Пример с bytes.Buffer:
type Buffer struct {
buf []byte
smallBuf [64]byte // SBO для небольших данных
}
func NewBuffer() *Buffer {
b := &Buffer{}
b.buf = b.smallBuf[:0] // используем стек, а не кучу
return b
}
Преимущества:
- Уменьшает нагрузку на GC
- Ускоряет работу (меньше аллокаций)
- Уменьшает фрагментацию памяти
Когда полезно:
- Для часто создаваемых/удаляемых объектов
- При работе с небольшими данными (<1KB)
- В высоконагруженных сервисах