Минимальный размер объекта равен 1:
class X {};
sizeof(X) >= 1
Но производному классу не нужно выделять место для этого пространства, если оно не используется:
class Y : public X {};
sizeof(Y) >= 1
Такхотя класс X сам по себе занимает 1 байт, он не транслируется в родительский класс.Таким образом, с точки зрения Y класс X занимает 0 байтов.
Итак, здесь мы можем сказать, что компилятор оптимизировал базовый класс (хотя технически он ничего не сделал. Нам просто нужно применить правило, согласно которому нет объектаимеет нулевой размер).
int main()
{
std::cout << sizeof(X) << ":" << sizeof(Y) << "\n";
}
Создает следующий вывод:
> ./a.exe
1:1
>
Причина, по которой класс должен иметь размер больше нуля, заключается в том, что адрес каждого объекта уникален.Если компилятор позволил классу иметь нулевой размер, то существует потенциальная легкая ошибка, когда все переменные (объекты) имеют одинаковый адрес памяти (так как все они имеют нулевой размер).Простое правило, позволяющее обойти эту потенциальную проблему, заключается в том, что все объекты должны иметь ненулевой размер.
Резюме:
size_of_type(X) = size_of_type(base) + sum(size_of_type(members)) + padding + (extra stuff like vtable pointer etc);
sizeof(<CLASS>) = min(1, size_of_type(<CLASS>))