Чем стек отличается от кучи? Как компилятор решает, куда аллоцировать объект?
Answer from AI
sobes.tech AI
Стек и куча — это два разных способа управления памятью.
Стек — это область памяти, где хранятся локальные переменные функций и параметры. Он организован по принципу LIFO (последний вошёл — первый вышел). Выделение и освобождение памяти в стеке очень быстрое, так как происходит просто сдвиг указателя стека.
Куча — это область памяти для динамического выделения объектов, срок жизни которых может выходить за рамки вызова функции. Память в куче выделяется и освобождается вручную или сборщиком мусора, что медленнее, чем в стеке.
В Go компилятор решает, куда аллоцировать объект, с помощью анализа escape-анализатора. Если переменная "убегает" из функции (например, возвращается или сохраняется в глобальную переменную), она выделяется в куче. Если же переменная используется только внутри функции и не выходит за её пределы, она размещается в стеке.
Пример:
func foo() *int {
x := 10 // если x возвращается, то выделяется в куче
return &x
}
func bar() {
y := 20 // y живёт только внутри bar, выделяется в стеке
fmt.Println(y)
}
Таким образом, компилятор анализирует жизненный цикл переменной и решает, где её размещать.