Объект пустого класса не может иметь нулевой размер из-за требований стандарта. Поэтому компилятор добавляет "фиктивный байт" (
dummy byte), чтобы каждый объект имел уникальный адрес.Простой пример
#include <iostream>
class Empty {};
int main() {
std::cout << "Размер пустого класса: " << sizeof(Empty) << " байт\n";
return 0;
}
Вывод (на большинстве компиляторов):
Размер пустого класса: 1 байт
Что если создать массив пустых объектов?
#include <iostream>
class Empty {};
int main() {
Empty arr[10]; // Создаем массив из 10 объектов
std::cout << "Размер массива из 10 пустых объектов: " << sizeof(arr) << " байт\n";
return 0;
}
Вывод
Размер массива из 10 пустых объектов: 10 байт
🟠Унаследованный пустой класс (Empty Base Optimization - EBO)
Если пустой класс используется в наследовании, компилятор может убрать его размер (оптимизация Empty Base Optimization, EBO).
#include <iostream>
class Empty {};
class Derived : public Empty {
int value; // 4 байта (обычно)
};
int main() {
std::cout << "Размер пустого класса: " << sizeof(Empty) << " байт\n";
std::cout << "Размер наследника: " << sizeof(Derived) << " байт\n";
return 0;
}
Вывод
Размер пустого класса: 1 байт
Размер наследника: 4 байта (а не 5!)
Ставь 👍 и забирай 📚 Базу знаний