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

74
задан Community 23 May 2017 в 12:26
поделиться

4 ответа

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

115
ответ дан 24 November 2019 в 11:51
поделиться

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

Полный ответ см. в Stroustrup.

35
ответ дан 24 November 2019 в 11:51
поделиться

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

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

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

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

struct Empty { };

struct Optimized : public Empty {
    char c;
};

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

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

26
ответ дан 24 November 2019 в 11:51
поделиться

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

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

4
ответ дан 24 November 2019 в 11:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: