← Назад к вопросам

Сколько памяти занимает пустой класс?

2.0 Middle🔥 131 комментариев
#Язык C++

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Размер пустого класса в C++

Ответ кажется парадоксальным: пустой класс занимает минимум 1 байт. Это связано с фундаментальным принципом C++ — каждый объект должен иметь уникальный адрес в памяти.

Почему 1 байт?

В C++ стандарте есть правило: размер любого объекта (включая пустой класс) должен быть не менее 1 байта. Это гарантирует, что:

  • Два различных объекта имеют разные адреса
  • Указатели на объекты можно сравнивать и использовать в контейнерах
  • Арифметика указателей работает предсказуемо
class Empty {};

std::cout << sizeof(Empty);  // Выведет: 1

Виртуальные функции и наследование

Ситуация усложняется при добавлении виртуальных функций — компилятор добавляет vtable указатель:

class EmptyWithVirtual {
public:
    virtual ~EmptyWithVirtual() {}
};

std::cout << sizeof(EmptyWithVirtual);  // 8 байт (x64) или 4 байта (x32)

Это необходимо для работы полиморфизма — RTTI и виртуальных вызовов требуют доступа к таблице методов.

Empty Base Optimization (EBO)

К счастью, C++ имеет EBO — оптимизацию, которая позволяет избежать лишних байтов при наследовании от пустого класса:

class Base {};
class Derived : public Base {
    int value;
};

std::cout << sizeof(Derived);  // 4 байта (на x32), не 5!

Компилятор не выделяет отдельное место для пустого базового класса — адрес Derived совпадает с адресом Base части.

Специальный случай: функторы

Пустые классы-функторы также занимают 1 байт:

class MyFunctor {
public:
    void operator()() const {}
};

std::cout << sizeof(MyFunctor);  // 1

Это позволяет компиляторам оптимизировать контейнеры стандартной библиотеки через механизм zero-size optimization.

Практическое значение

Вхотя 1 байт кажется малым, это правило важно для:

  • Контейнеров (vector, map) — пустые компараторы не добавляют размер
  • Статических утверждений о размерах структур
  • Битовых полей и упаковки данных
  • Выравнивания памяти (alignment) при работе с массивами объектов

Выравнивание (alignment)

Реальный размер объекта в памяти также зависит от выравнивания:

class Empty {};  // sizeof = 1
Empty arr[10];   // Каждый объект в массиве занимает минимум sizeof(Empty)

Компилятор может добавить padding для выравнивания, но гарантирует, что sizeof(Empty) >= 1.

Проверка

Лучший способ узнать точный размер — всегда использовать sizeof() и учитывать специфику платформы:

  • x86 vs x64 дают разные размеры vtable указателей
  • Разные компиляторы могут оптимизировать по-разному
  • Флаги оптимизации влияют на применение EBO
Сколько памяти занимает пустой класс? | PrepBro