Во многих языках, локальные переменные расположены в стеке вызововGO - Побег анализ
В JavaScript/Python, только закрытия переменные находятся в куче, потому что они должны жить за вызовы функций, они созданы.
В GO, некоторые GO типов (например, ломтик типа []int
) делать ссылки на другие части памяти, как JavaScript/Python.
В GO не все типы переменных содержат ссылки, такие как Javascript/Python.
Например,
1) [3]int
тип переменной b
непосредственно хранит массив int
-х, таких как C, за исключением того, что С позволяет получить доступ каждого местоположения элемента массива с использованием C синтаксис &b[index]
, для большего контроля
2) int
переменная типа c
непосредственно хранит значение int
, например C, за исключением того, что C дает больше контроля, предоставляя синтаксис (&c
), чтобы получить доступ к местоположению.
В GO, мое понимание, для локальных переменных, чтобы быть на куче/стек зависит от применения анализа побега компилятора в примере кода (ниже),
func foo() []int {
// the array lives beyond the call to foo in which it is created
var a [5]int
return a[:] // range operator
}
, который сообщает компилятору, что переменная a
живет за ее пределами, поэтому выделяйте ее в кучу, но не стек.
Вопрос:
ли переменная a
получить выделяется в куче?
Обратите внимание, что не все языки ведут себя как C. На многих языках, таких как javascript и lisp, закрытие фактически является частью стека. Только то, что стек для языка не реализован в «стеке» в смысле С, а стек реализован как связанный список, а это означает, что стек на некоторых языках реализован в куче. Реализации Javascript могут либо реализовать классический функциональный стек связанных списков, либо какой-то механизм обнаружения закрытия для захвата закрытых свободных переменных. Оба ведут себя одинаково. – slebetman
Вот одна хорошая серия статей о написании интерпретатора Ruby в Ruby, который объясняет традиционную реализацию закрытий на функциональных языках: http://hokstad.com/how-to-implement-closures. Обратите внимание на его объяснение «Вместо традиционного стека, поместите кадры активации (аргументы и локальные переменные) для вызовов функции/метода в куче, как связанный список» - он реализует стек для своего интерпретатора в куче – slebetman