Middle+
102
questionbank

Где находится переменная, когда она выделяется в горутине?

Получайте ответы на вопросы в реальном времени с Sobes Copilot
Ответ от нейросети sobes.tech

Переменная может быть выделена как в стеке горутины, так и в куче. Это определяется с помощью механизма escape analysis (анализа утечек) компилятора Go.

Основные принципы escape analysis:

  • Если компилятор может доказать, что переменная живет только внутри одного вызова функции или только в пределах стека одной горутины (то есть не ссылается на нее извне), она выделяется в стеке этой горутины. Это быстрее, так как стек управляется автоматически и не требует сборки мусора.
  • Если компилятор не может доказать, что переменная ограничена стеком, или если на нее есть ссылки извне (например, передается по указателю в другую функцию, записывается в глобальную переменную, возвращается из функции по указателю), она выделяется в куче. Куча требует сборки мусора, что может замедлять выполнение.

Пример выделения в стеке:

go

Пример выделения в куче:

go

Escape analysis происходит во время компиляции. Его можно проверить, используя флаг -gcflags "-m":

bash

Вывод компилятора покажет, какие переменные "escape to heap".

Таким образом, местоположение переменной (стек vs куча) определяется не тем, что переменная выделяется в горутине, а тем, как компилятор Go анализирует ее жизненный цикл и области видимости.