Почему размер пустого класса В C++ не равен нулю? [дубликат]




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






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



#include <iostream>

class Test
{
};

int main()
{
std::cout << sizeof(Test);
return 0;
}
867   5  

5 ответов:

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

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

посмотреть Страуструп для полного ответа.

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

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

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

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

struct Empty { };

struct Optimized : public Empty {
    char c;
};

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

Бьярн Страуструп говорит об этом тоже.

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

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

  1. State
  2. поведение
  3. личность

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

Comments

    Ничего не найдено.