Конспект: значимые и ссылочные типы
Feb 2025Классификация типов данных
Ссылочные типы (Reference Types)
Примеры: классы, строки (string), делегаты, интерфейсы, массивы.
Хранение: хранятся в динамической памяти (управляемая куча).
Выделение памяти: операция относительно дешевая, заключается в увеличении указателя на свободную область памяти.
Освобождение памяти: управляется сборщиком мусора, который автоматически освобождает неиспользуемые объекты.
Значимые типы (Value Types)
Примеры: простые типы (например, int, float, bool), структуры, перечисления.
Хранение: размещаются на стеке потока выполнения.
Выделение памяти: простая и недорогая операция, заключающаяся в увеличении регистра стека. Возможно выделение памяти сразу под несколько переменных.
Очистка памяти: происходит автоматически после завершения области видимости переменной, путём восстановления предыдущего значения регистра стека. Возможна очистка памяти сразу для нескольких переменных.
Сравнение значимых и ссылочных типов
Практическое использование: ссылочные типы чаще используются в реальных приложениях, тогда как значимые типы реже применяются в веб-разработке и мобильных приложениях.
Потребление памяти: ссылочные типы требуют больше памяти, так как включают дополнительные данные (например, ссылки, служебные поля), кроме самих значений.
Производительность: алгоритмы, использующие значимые типы, работают эффективнее благодаря последовательному расположению данных в памяти, что улучшает производительность операций чтения/записи.
Стек vs Куча
Различия между стеком и кучей касаются не столько скорости обращения к памяти, сколько организации данных:
Стек:
Локальные переменные размещаются последовательно, что делает выделение и освобождение памяти более эффективным.
Компактное расположение данных способствует лучшей работе кеша процессора.
Размер стека ограничен (обычно около 1 МБ), что подходит для большинства нужд и соответствует размерам кеша современных процессоров.
Куча:
Объекты располагаются менее плотно, что снижает эффективность работы кеша.
Более гибкая система управления памятью, но требует большего количества ресурсов для её обслуживания.
Помимо непосредственных данных объекта, ссылочный тип включает в себя:
Индекс блока синхронизации (4 байта для x86, 8 байтов для x64): используется для синхронизации потоков, финализации объектов и работы сборщика мусора.
Ссылка на таблицу виртуальных методов (4 байта для x86, 8 байтов для x64): содержит адреса виртуальных и унаследованных методов класса.
Дополнительные детали о таблицах виртуальных методов и работе статических и интерфейсных методов можно найти в книге "Оптимизация приложений на платформе .NET".