Понимаю, что стек это временно, пока хранится в области видимости {}, значимые типы
- хранятся в стеке, а переменная содержит адрес её в стеке, ссылочные хранят в стеке
ссылку на кучу в которой содержится объект.
Но почему бы не оставить что либо одно? Да, стек объёмом всего 1мб, но почему его
нельзя было расширить?
В чем преимущества такого подхода и зачем стоило создавать такое деление?
Естественно, искал, но ответов малу-по-малу.
Ответы
Ответ 1
Для начала, куча, как и стек — деталь имплементации. Стандарт языка не предписывает
использование кучи для хранения объектов.
В Майкрософтовской имплементации C# куча используется потому, что в ней удобно размещать
долгоживущие объекты.
Каким большим не был бы стек, он работает так, что по окончанию работы функции выделенные
на стеке объекты умирают. Поэтому если время жизни объекта превышает (или потенциально
превышает) время выполнения функции, которая его создала, стек для такого объекта не
подходит.
Хуже того, объект можно освободить из стека только после того, как все предыдущие
объекты освобождены. Это значит, что в коде
string f()
{
StringBuilder sb = new StringBuilder();
// цикл заполнения
string s = sb.ToString();
return s;
}
объект sb, который создаётся до объекта строки, будет лежать в стеке, и не сможет
быть освобождён, пока вызывающей функции нужен объект s!
Из двух сущностей — кучи и стека — проще избавиться от стека, и выделять все объекты
в куче. Стандарт языка не предписывает, что стековые объекты обязаны умирать вместе
с фреймом стека (стандарт языка вовсе не упоминает стек), поэтому если такие объекты
съест когда-нибудь потом сборщик мусора, ничего страшного не произойдёт. Но это менее
эффективно, чем размещение переменных на стеке, т. к. увеличивает нагрузку на сборщик
мусора.
Комментариев нет:
Отправить комментарий