@nikifovadim
Software Engineer

Какие отличие между значимыми и ссылочными типами? Зачем придумали такое разделение? Нельзя было придумать только либо значимые либо ссылочные?

Какие отличие между значимыми и ссылочными типами?

Значимые типы (value type) хранятся в стеке. Стек - это структура данных, которая растет снизу вверх: каждый новый элемент помещаются поверх предыдущего. Время жизни переменных таких типов ограничено их контекстом. Физически стек - это некоторая область памяти в адресном пространстве. А ссылочные типы (reference type) хранятся в куче, это другая область памяти, которую можно представить как неупорядоченный набор различных объектов. Когда создаётся объект ссылочного типа в стеке помещается ссылка на адрес в куче. Когда этот объект перестает использоваться, то ссылка уничтожается, а память в куче очищается.
Может у кого есть что добавить?

Зачем придумали такое разделение?

Нельзя было придумать только либо значимые либо ссылочные?
  • Вопрос задан
  • 322 просмотра
Решения вопроса 1
insighter
@insighter
-First time? - Huh? (C#, React, JS)
Все хранить в стеке невозможно для обычных программ.
Все хранить в куче реально (достаточно упаковывать все valued-переменные), но очень и очень не оптимально. Работа со стеком гораздо быстрее, для работы с ним есть специализированные регистры процессора, а для того чтобы обратится к участку произвольной памяти компьютера даже на низком уровне надо сделать много операций. И очищается стек моментально, никаких сборщиков мусора не нужно.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
xJAYx
@xJAYx
А я и не утверждаю, что я эксперт.
Все, что вы описали по value type'ам - практически все неверно. Да и пофиг вообще, где что хранится, 99% программистов все равно этими знаниями не пользуются - только понтуются перед друг другом. Там самое главное - семантика копирования... это все... Все знатоки хранения структур сразу сливаются на вопросе по cache-aware и cache-oblivious алгоритмам (где это вот прям очень могло бы пригодится!)

Значимые типы (value type) хранятся в стеке. - нет, это неверно. Они могут хранится в стеке. Даже локальные value type'ы могут там и не хранится.
public void m1() {
int i = 0;
}
Даже вот эта переменная может хранится в куче, если кто то добавит замыкание снизу.
Ответ написан
Комментировать
@Myclass
ответ кроется в самой сущности. Сохранить переменную byte, int, double word или адресс - для этого понадобиться всего-то навсего байт, два байта, ну или столько, сколько на сегодня актуально - например 8 байтов (64 Bit).
Это всегда более менее легко организовать. Например тот-же int array с его элементами. Они все чинно лежат друг за другом. Если идёт разговор о сложных структурах, начиная со string, то там уже проще сохранять и организовывать адресса для тех мест, где на самом деле лежат эти структуры.

И всё - нет никакого злого умысла или тупости. Всё сделано для простоты организации всех этих вещей и легкости справлятся с такими задачами, как создавание переменных/обьектов, их видоизменения и удаления.

Так-же как и с Carbadge Collection. Тратить время на "точное" удаление обьектов из памяти во время работы программы - свою программу не уважать. Но здесь распределение действий, а в вашем вопросе распределение мест.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы