Go использует Escape-анализ и сборку мусора для управления распределением памяти в стеке и куче. Go FAQ также говорит:
Как узнать, размещена ли переменная в куче или стеке?
С точки зрения правильности вам не нужно знать. Каждая переменная в Go существует, пока есть ссылки на нее. Место хранения, выбранное реализацией, не имеет отношения к семантике языка.
Поэтому Go выделяет память для переменной и резервирует ее по крайней мере до тех пор, пока она не понадобится.
Мой вопрос: написано ли это (абстрактное) поведение в Go Спецификации языка программирования ? Я обнаружил, что часть выделения написана, например, в Раздел выделения :
Встроенная функция new
принимает тип T
, выделяет память для переменной этого типа во время выполнения, и возвращает значение типа *T
, указывающее на него.
Но есть ли описание части резервирования? Можем ли мы подтвердить факт «Каждая переменная в Go существует, пока есть ссылки на нее»? Если нет, то есть ли причины?
Например, я хочу подтвердить, что следующая программа не должна выдавать SIGSEGV или подобные исключения, если у компилятора Go нет ошибок.
func foo() *int {
x := 42
return &x
}
func main() {
px := foo()
fmt.Println(*px)
}
Чтобы быть более точным, я ожидал, что две части, «Go выделяет память, когда new
или что-то в этом роде» и «Go резервирует выделенную память, по крайней мере, для нее необходимо», должны быть записаны в спецификации. Меня не волнуют детали его реализации, хотя https://github.com/golang/go использует Escape-анализ и сборку мусора.
Если последняя часть не существует, то в крайнем случае она действительна реализация согласно спецификации c, что память не выделяется сразу после ее выделения. Но это смешно, поэтому я думаю, что spe c должен сделать это недействительным.
Редактировать для закрытия: я не думаю, что этот вопрос основан на мнении. Этот вопрос является простым вопросом да / нет, спрашивая описание в спецификации. Причину существования / несуществования можно ответить цитатами. Если нет, пожалуйста, покажите / прокомментируйте, какие пункты основаны на мнении. Я улучшу это.