🟡 Средний · 2 очк. Go runtime
Почему выделение памяти на стеке предпочтительнее кучи?
A Стек больше по размеру
B Стек не требует сборки мусора и быстрее выделяет/освобождает
C Стек потокобезопасен
D Стек поддерживает указатели
Объяснение вопроса

Выделение на стеке - это по сути сдвиг указателя стека при входе в функцию и сдвиг обратно при выходе. Ни аллокатор, ни GC не участвуют. Выделение в куче требует аллокатора и в дальнейшем работы GC для освобождения.

Сравнение

  • Стек: O(1), нет давления на GC, кеш-локальность (последовательные адреса)
  • Куча: аллокация дороже, объект живёт до сборки мусора
func onStack() {
    var buf [1024]byte  // массив на стеке
    use(buf[:])
}

func onHeap() {
    buf := make([]byte, 1024)  // данные в куче, слайс на стеке
}

У горутины стек начинается с нескольких КБ и при необходимости растёт (и сжимается). Миллионы горутин возможны именно из-за лёгких стеков.

🧠Квиз 🏆Лидеры 🎯Собесед. 📖Вопросы 📚База зн.