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

Оптимизация пустого базового класса теперь является обязательной оптимизацией (по крайней мере, для классов стандартного макета)?

Согласно С++ 11 9.1/7 (проект n3376), класс стандартного макета - это класс, который:

  • не содержит нестатических элементов данных класса нестандартного макета (или массива таких типов) или ссылки,

  • не имеет виртуальных функций (10.3) и виртуальных базовых классов (10.1),

  • имеет тот же контроль доступа (раздел 11) для всех нестатических членов данных,

  • не имеет базовых классов нестандартной компоновки,

  • либо не имеет нестатических членов данных в самом производном классе и не более одного базового класса с нестатическими членами данных, либо не имеет базовых классов с нестатическими членами данных, а

  • не имеет базовых классов того же типа, что и первый нестатический элемент данных.

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

Кроме того, в 9.2/19 говорится, что:

Указатель на объект структуры стандартного макета, соответствующим образом преобразованный с помощью reinterpret_cast, указывает на его начальный член (или если этот элемент является битовым полем, а затем в единицу, в которой он находится) и наоборот. [Примечание. Таким образом, в рамках объекта структуры стандартного макета может быть указано неназванное заполнение, но не в его начале, по мере необходимости, для достижения соответствующего выравнивания. -end note]

Это, по-видимому, означает, что Оптимизация пустого базового класса теперь является обязательной оптимизацией, по крайней мере для классов стандартного макета. Я хочу сказать, что если пустая оптимизация базы данных не предусмотрена, то макет класса стандартного макета не будет стандартным, а зависит от того, реализует ли реализация или не упомянула оптимизацию. Правильно ли я рассуждаю, или я что-то пропустил?

4b9b3361

Ответ 1

Да, вы правы, это было указано в предложениях "PODs revisited": http://www.open-std.org/jtc1/sc22/WG21/docs/papers/2007/n2342.htm#ABI

Компилятор Embarcadero также сообщает об этом: http://docwiki.embarcadero.com/RADStudio/en/Is_standard_layout

Другим ключевым моментом является [class.mem]/16

Два типа структуры стандартной компоновки (раздел 9) совместимы с макетами, если они имеют одинаковое количество нестатических элементов данных, а соответствующие нестатические члены данных (в порядке объявления) имеют совместимые с макетами типы (3.9).

Обратите внимание, что только члены данных влияют на совместимость макетов, а не на базовые классы, поэтому эти два стандартных класса макета совместимы с макетами:

struct empty { };
struct stdlayout1 : empty { int i; };

struct stdlayout2 { int j; };