Изучаю C# и встретил два понятия стек и куча. Говорится, что ссылочные типы хранятся на куче, а значимые в стеке, но я так и не понял где именно они находятся (физически), кокой у них размер и как работают. Буду рад получить объяснение.
Почитайте ответ к этому вопросу: Жизненный цикл переменной value типа в памяти
Если кратко, то:
- куча и стек находятся в оперативной памяти
- размер стека равен количеству выделенных страниц памяти под него (размер 1 страницы = 1Мб), по умолчанию под стек выделяется 1 страница, но очень редко может быть больше (в ОС Windows стек всегда равен 1 Мб)
- для каждого потока создаётся отдельный стек (если в процессе два потока, то существует два отдельных стека)
- размер кучи ограничен количеством доступной памяти
- в куче хранятся ссылочные типы, а в стеке - адреса возврата и локальные переменные (если переменная ссылочного типа, то храниться адрес на неё в куче; если значимого, то значение)
- за удаление объектов на куче отвечает сборщик мусора, в стеке все данные определённого метода удаляется после завершения его работы
Спасибо за объяснение!