Ответ
Размер объекта пустого класса в 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).