Возможный дубликат:
С++: Каков размер объекта пустого класса?
Почему следующий вывод 1
?
#include <iostream>
class Test
{
};
int main()
{
std::cout << sizeof(Test);
return 0;
}
Возможный дубликат:
С++: Каков размер объекта пустого класса?
Почему следующий вывод 1
?
#include <iostream>
class Test
{
};
int main()
{
std::cout << sizeof(Test);
return 0;
}
В стандарте не допускаются объекты (и их классы) размера 0, поскольку это позволяет двум одинаковым объектам иметь один и тот же адрес памяти. Поэтому даже пустые классы должны иметь размер (по крайней мере) 1.
Чтобы гарантировать, что адреса двух разные объекты будут разными. По этой же причине "новое" всегда возвращает указатели на отдельные объекты.
Для получения полного ответа см. Stroustrup.
Стандарт С++ гарантирует, что размер любого класса по крайней мере один. В стандарте С++ указано, что ни один объект не должен иметь тот же адрес памяти, что и другой объект. Для этого есть несколько веских причин.
Чтобы гарантировать, что new
всегда будет возвращать указатель на отдельный адрес памяти.
Чтобы избежать некоторых делений на ноль. Например, арифметика указателей (многие из которых выполняются автоматически компилятором) включает деление на sizeof(T)
.
Обратите внимание, что это не означает, что пустой базовый класс добавит 1 к размеру производного класса:
struct Empty { };
struct Optimized : public Empty {
char c;
};
// sizeof(Optimized) == 1 with g++ 4.0.1
Класс без каких-либо элементов данных и функции-члена такой тип класса известен как пустой класс. Размер объекта пустого класса всегда 1 байт.
Когда мы создаем объект любого класса, в то время объект всегда получает 3 характеристики i.e.
Когда мы создаем объект пустого класса, в то время состояние этого объекта ничего. Поведение этого объекта также не имеет значения, но компилятор присваивает ему уникальный адрес. Память в компьютере всегда организована в виде байтов, а минимальная память, доступная в местоположении адреса объекта, составляет 1 байт. Поэтому размер объекта пустого класса равен 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.