Выбор ответа Middle Память, GC и pprof спрашивают часто обновлено
Escape analysis: что попадёт в кучу
Вопрос
Где окажется переменная u в этой функции?
func NewUser(name string) *User {
u := User{Name: name}
return &u
}
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: В куче: указатель возвращается из функции. Компилятор проводит escape analysis: адрес u уходит наружу через return, поэтому значение должно пережить кадр стека и размещается в куче.
Варианты ответа
- На стеке, потому что
uобъявлена локально - В куче, потому что любой
&всегда выделяет в куче - В сегменте данных программы, как глобальная
- В куче: указатель возвращается из функцииправильный ответ
Разбор
Компилятор проводит escape analysis: адрес u уходит наружу через return, поэтому значение должно пережить кадр стека и размещается в куче. Сам по себе & не означает кучу: если указатель не убегает, значение останется на стеке. Глобальные данные тут ни при чём. Проверить можно go build -gcflags=-m: будет moved to heap: u.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.