2015-08-03 1 views
0

Я новичок в Go и нашел, что это нормально, чтобы вернуть адрес локальной переменной, определенной в функции. Это, очевидно, невозможно в C, поскольку локальная переменная находится в стеке.Все ли переменные в Go выделены в кучу?

Так что я просто задаюсь вопросом, почему это нормально делать в Go? В Go локальная переменная находится в куче? Будет ли это влиять на производительность, поскольку выделение памяти кучи довольно дорого, чем стек? Возможно ли разместить локальную переменную в стеке в Go? Или на самом деле есть стек памяти в Go?

+3

Связанный: [Stack vs распределение кучи структур в Go, и как они относятся к сборке мусора] (http://stackoverflow.com/questions/10866195/stack-vs-heap-allocation-of-structs-in- идти-и-как-они-относятся к мусорному-сбору меди) – icza

ответ

10

There's a very clear answer to that question in the FAQ:

Как я знаю, выделяется ли переменная в куче или стека?

С точки зрения правильности, вам не нужно знать. Каждая переменная в Go существует до тех пор, пока есть ссылки на нее. Место хранения , выбранное реализацией, не имеет отношения к семантике языка.

Место хранения оказывает влияние на эффективную запись программ. Когда это возможно, компиляторы Go будут выделять переменные, которые являются локальными для функции в фрейме стека этой функции. Однако, если компилятор не может доказать, что переменная не указана после , функция возвращает, то компилятор должен выделить переменную на сборку кучи мусора, чтобы избежать оборванных ошибок указателя. Кроме того, если локальная переменная очень велика, возможно, имеет смысл хранить ее в куче, а не в стеке.

В текущих компиляторах, если переменная имеет свой адрес, то переменная является кандидатом на распределение в куче. Однако базовый анализ удаления распознает некоторые случаи, когда такие переменные не будут жить за возвратом от функции и могут находиться в стеке.

TLDR: Вам все равно. Go заботится о выделении для вас.

Смежные вопросы