Как хранится массив структур в памяти в C#?

«Как хранится массив структур в памяти в C#?» — вопрос из категории C# Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Массив структур (struct[]) в C# хранится в непрерывном блоке памяти в управляемой куче. Это отличается от массива ссылочных типов (class[]), который хранит непрерывный блок ссылок (указателей), а сами объекты размещаются отдельно.

Ключевые особенности:

  • Плотное расположение: Все поля структур расположены последовательно друг за другом. Это обеспечивает отличную локальность данных и эффективность при обработке в циклах (например, с помощью Span<T>).
  • Отсутствие накладных расходов на ссылки: Нет дополнительных указателей на каждый элемент.
  • Значимая семантика: При копировании массива (например, через Clone()) копируются сами значения структур, а не ссылки.

Пример:

public struct Point { public int X; public int Y; }

Point[] points = new Point[1000];
// В памяти это один непрерывный блок размером ~ 1000 * (sizeof(int) * 2).
// Доступ к points[500].Y выполняется очень быстро за счет вычисления смещения.

Важное замечание: Если структура содержит ссылочные типы (например, string), то сами эти объекты хранятся отдельно в куче, а в массиве хранится только ссылка на них.