Что занимает меньше памяти: класс или структура в C#?

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

Ответ

В C# структура (struct) обычно занимает меньше памяти, чем класс (class), из-за различий в их хранении и накладных расходах.

Основные причины:

  1. Размещение в памяти: Экземпляры структур являются значимыми типами (value types). Они хранятся там, где объявлены: в стеке (если это локальная переменная) или внутри родительского объекта (например, как поле класса). Экземпляры классов — ссылочные типы (reference types) — всегда размещаются в управляемой куче, а в стеке или родительском объекте хранится только ссылка на них. Это создает дополнительные накладные расходы.
  2. Накладные расходы кучи: Каждый объект в куче имеет служебный заголовок (указатель на таблицу методов и данные для сборщика мусора), что добавляет минимум 8-16 байт (зависит от разрядности процесса) к размеру данных самого объекта.

Пример:

// Примерный размер: 8 байт (два int по 4 байта)
public struct PointStruct { public int X; public int Y; }

// Примерный размер: 24+ байта.
// Данные: 8 байт (X, Y).
// Накладные расходы кучи: ~16 байт.
// + ссылка на объект в стеке (4/8 байт).
public class PointClass { public int X; public int Y; }

Важные исключения и нюансы:

  • Если структура содержит ссылочные типы (например, string), разница в памяти уменьшается, так как сама ссылка хранится внутри структуры, а данные строки — в куче.
  • Большие структуры (например, > 16 байт) могут быть менее эффективными при передаче в методы по значению, так как происходит полное копирование всех данных. В таких случаях предпочтительнее передавать их по ссылке с модификатором in или использовать класс.
  • Основное правило выбора между struct и class должно основываться на семантике типа (значимый vs. ссылочный), а не только на экономии памяти.