nullreference.dev

Конспект: значимые и ссылочные типы

Feb 2025

Классификация типов данных

a

Ссылочные типы (Reference Types)

Примеры: классы, строки (string), делегаты, интерфейсы, массивы.

Хранение: хранятся в динамической памяти (управляемая куча).

Выделение памяти: операция относительно дешевая, заключается в увеличении указателя на свободную область памяти.

Освобождение памяти: управляется сборщиком мусора, который автоматически освобождает неиспользуемые объекты.

Значимые типы (Value Types)

Примеры: простые типы (например, int, float, bool), структуры, перечисления.

Хранение: размещаются на стеке потока выполнения.

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

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

Сравнение значимых и ссылочных типов

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

Потребление памяти: ссылочные типы требуют больше памяти, так как включают дополнительные данные (например, ссылки, служебные поля), кроме самих значений.

Производительность: алгоритмы, использующие значимые типы, работают эффективнее благодаря последовательному расположению данных в памяти, что улучшает производительность операций чтения/записи.

Стек vs Куча

Различия между стеком и кучей касаются не столько скорости обращения к памяти, сколько организации данных:

Стек:

  • Локальные переменные размещаются последовательно, что делает выделение и освобождение памяти более эффективным.

  • Компактное расположение данных способствует лучшей работе кеша процессора.

  • Размер стека ограничен (обычно около 1 МБ), что подходит для большинства нужд и соответствует размерам кеша современных процессоров.

Куча:

  • Объекты располагаются менее плотно, что снижает эффективность работы кеша.

  • Более гибкая система управления памятью, но требует большего количества ресурсов для её обслуживания.

Помимо непосредственных данных объекта, ссылочный тип включает в себя:

  • Индекс блока синхронизации (4 байта для x86, 8 байтов для x64): используется для синхронизации потоков, финализации объектов и работы сборщика мусора.

  • Ссылка на таблицу виртуальных методов (4 байта для x86, 8 байтов для x64): содержит адреса виртуальных и унаследованных методов класса.

Дополнительные детали о таблицах виртуальных методов и работе статических и интерфейсных методов можно найти в книге "Оптимизация приложений на платформе .NET".

[ back to home ]