Стандарт не разрешает объекты (и их классы) размера 0, так как это позволило бы двум различным объектам иметь один и тот же адрес памяти. . Поэтому даже пустые классы должны иметь размер (как минимум) 1.
Чтобы гарантировать, что адреса двух различных объектов будут разными. По этой же причине "new" всегда возвращает указатели на разные объекты.
Полный ответ см. в Stroustrup.
Стандарт C ++ гарантирует, что размер любого класса не меньше единицы. Стандарт C ++ гласит, что ни один объект не должен иметь тот же адрес памяти, что и другой объект. Для этого есть несколько веских причин.
Чтобы гарантировать, что new
всегда будет возвращать указатель на отдельный адрес памяти.
Чтобы избежать деления на ноль. Например, арифметические операции с указателями (многие из которых выполняются компилятором автоматически) включают деление на sizeof (T)
.
Обратите внимание, однако, что это не означает, что пустой базовый класс добавит 1 к размеру производного класса:
struct Empty { };
struct Optimized : public Empty {
char c;
};
// sizeof(Optimized) == 1 with g++ 4.0.1
Что сказали Мауриц и Петер.
В этом контексте интересно отметить, что компиляторы могут выполнять оптимизацию пустого базового класса (EBCO):
#include <iostream>
struct Foo {};
struct Bar : Foo {};
int main () {
std::cout << sizeof(Foo) << ',' << sizeof(Bar) << std::endl;
}
Это, вероятно, напечатает «1,1», если вы скомпилируете и запустите его. См. Также Vandevoorde / Josuttis 16.2 на EBCO.