Подтвердить что ты не робот

Быстрое понимание стека/кучи

Я хочу, чтобы undesrtand, что хранится в стеке/куче в быстром. У меня есть черновая оценка: Все, что вы печатаете, и адрес памяти отображаются не значениями, которые хранятся в стеке, и то, что распечатывается как значения, находятся в куче, в основном в соответствии со значениями и ссылочными типами. Я совершенно неправ? И, возможно, вы могли бы представить визуальное представление стека/кучи?

4b9b3361

Ответ 1

Как уже говорилось, ссылочные типы хранятся в куче, а значения в стеке...

Здесь я хочу дать объяснение, почему...

Стек и куча?

Стек используется для статического выделения памяти и Heap для динамического выделения памяти, оба хранятся в оперативной памяти компьютера.

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

enter image description here

Переменным, выделенным в куче, выделяется их память во время выполнения, и доступ к этой памяти немного медленнее, но размер кучи ограничен только размером виртуальной памяти. Элементы кучи не имеют зависимостей друг от друга и всегда могут быть доступны случайным образом в любое время. Вы можете выделить блок в любое время и освободить его в любое время. Это усложняет отслеживание того, какие части кучи выделены или свободны в любой момент времени.

Для спасения закрытия: - Важно помнить, что в случаях, когда значение, хранящееся в стеке, захватывается в замыкании, это значение будет скопировано в кучу, чтобы оно оставалось доступным к моменту выполнения замыкания.

Для получения дополнительной информации: http://net-informations.com/faq/net/stack-heap.htm

Ответ 2

Классы (ссылочные типы) выделяются в куче, типы значений (например, Struct, String, Int, Bool и т.д.) живут в стеке. См. Эту тему для получения более подробных ответов: Зачем выбирать структуру над классом?