Подтвердить что ты не робот

Почему размер пустого класса в С++ не равен нулю?

Возможный дубликат:
С++: Каков размер объекта пустого класса?

Почему следующий вывод 1?

#include <iostream>

class Test
{
};

int main()
{
    std::cout << sizeof(Test);
    return 0;
}
4b9b3361

Ответ 1

В стандарте не допускаются объекты (и их классы) размера 0, поскольку это позволяет двум одинаковым объектам иметь один и тот же адрес памяти. Поэтому даже пустые классы должны иметь размер (по крайней мере) 1.

Ответ 2

Чтобы гарантировать, что адреса двух разные объекты будут разными. По этой же причине "новое" всегда возвращает указатели на отдельные объекты.

Для получения полного ответа см. Stroustrup.

Ответ 3

Стандарт С++ гарантирует, что размер любого класса по крайней мере один. В стандарте С++ указано, что ни один объект не должен иметь тот же адрес памяти, что и другой объект. Для этого есть несколько веских причин.

  • Чтобы гарантировать, что new всегда будет возвращать указатель на отдельный адрес памяти.

  • Чтобы избежать некоторых делений на ноль. Например, арифметика указателей (многие из которых выполняются автоматически компилятором) включает деление на sizeof(T).

Обратите внимание, что это не означает, что пустой базовый класс добавит 1 к размеру производного класса:

struct Empty { };

struct Optimized : public Empty {
    char c;
};

// sizeof(Optimized) == 1 with g++ 4.0.1

Bjarne Stroustrup говорит об этом тоже.

Ответ 4

Класс без каких-либо элементов данных и функции-члена такой тип класса известен как пустой класс. Размер объекта пустого класса всегда 1 байт.

Когда мы создаем объект любого класса, в то время объект всегда получает 3 характеристики i.e.

  • Государство
  • Поведение
  • Идентичность

Когда мы создаем объект пустого класса, в то время состояние этого объекта ничего. Поведение этого объекта также не имеет значения, но компилятор присваивает ему уникальный адрес. Память в компьютере всегда организована в виде байтов, а минимальная память, доступная в местоположении адреса объекта, составляет 1 байт. Поэтому размер объекта пустого класса равен 1 байт.

Ответ 5

Что сказал Мауриц и Петер.

В этом контексте интересно отметить, что компиляторы могут выполнять пустую оптимизацию базового класса (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.