Выбор ответа Middle Память, GC и pprof спрашивают часто обновлено

Escape analysis: что попадёт в кучу

Вопрос

Где окажется переменная u в этой функции?

func NewUser(name string) *User {
    u := User{Name: name}
    return &u
}

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: В куче: указатель возвращается из функции. Компилятор проводит escape analysis: адрес u уходит наружу через return, поэтому значение должно пережить кадр стека и размещается в куче.

Варианты ответа

  1. На стеке, потому что u объявлена локально
  2. В куче, потому что любой & всегда выделяет в куче
  3. В сегменте данных программы, как глобальная
  4. В куче: указатель возвращается из функцииправильный ответ

Разбор

Компилятор проводит escape analysis: адрес u уходит наружу через return, поэтому значение должно пережить кадр стека и размещается в куче. Сам по себе & не означает кучу: если указатель не убегает, значение останется на стеке. Глобальные данные тут ни при чём. Проверить можно go build -gcflags=-m: будет moved to heap: u.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.