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

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

Ответ

Размер объекта пустого класса в C++ не может быть нулевым. Согласно стандарту, каждый объект должен иметь уникальный адрес в памяти, поэтому компилятор выделяет как минимум 1 байт.

Демонстрация:

#include <iostream>

class TrulyEmpty {}; // Пустой класс

int main() {
    TrulyEmpty e1, e2;
    std::cout << "Size of TrulyEmpty: " << sizeof(TrulyEmpty) << " byte(s)" << std::endl; // Вывод: 1
    std::cout << "Address of e1: " << &e1 << std::endl;
    std::cout << "Address of e2: " << &e2 << std::endl; // Адреса будут различаться
    return 0;
}

Важная оптимизация: Empty Base Optimization (EBO). Когда пустой класс используется как базовый, компилятор может исключить его из размера производного класса, чтобы избежать накладных расходов.

class EmptyBase {};
class Derived : public EmptyBase {
    int value;
};
// Без EBO: sizeof(Derived) могло бы быть sizeof(int) + 1 (плюс выравнивание).
// С EBO: sizeof(Derived) часто равен просто sizeof(int) (например, 4 байта).

Эта оптимизация активно используется в STL (например, std::allocator часто является пустым базовым классом). На практике я учитываю это при проектировании полиморфных иерархий или политик (policy-based design).