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

Являются ли структуры переменных одного и того же типа совместимыми со структурой, содержащей массив этого типа?

Являются ли эти 2 структуры совместимыми с макетами?

struct One {
    float x, y, z;
};

struct Two {
    float c[3];
};

Оба содержат 3 поплавки, поэтому в некотором смысле это описание можно считать истинным (от N3797):

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

N4659 имеет другой текст:

Общая начальная последовательность двух структур стандартного макета (раздел 12) типы - это самая длинная последовательность нестатических элементов данных и бит-полей в порядке объявления, начиная с первого такого лица в каждом из структуры, так что соответствующие объекты имеют совместимость с макетами типы и ни один из них не является битовым полем, либо оба являются битовыми полями с той же шириной.

Два типа стандартной структуры (раздел 12) совместимы с макетами классы, если их общая начальная последовательность состоит из всех членов и бит-поля обоих классов (6.9).

Если ответ отрицательный, они не совместимы с макетами, то: было ли это намерение комитета? Возможно, они хотят, чтобы One и Two были совместимы с макетами (возможно, член комитета читает это и может уточнить).


Бонусный вопрос: гарантировано ли это, что sizeof(One)==sizeof(Two)?

4b9b3361

Ответ 1

Ну, нет:

[...], если они имеют одинаковое количество нестатических элементов данных [...]

One имеет три члена: x, y и z. Two имеет один член: c. Они не имеют одинакового количества нестатических элементов данных, поэтому они не совместимы с макетами.


Новая формулировка отличается, но вы оказываетесь в том же месте. [basic.types] определяет компоновку как:

Два типа cv1 T1 и cv2 T2 являются совместимыми с макетами типами, если T1 и T2 являются однотипными, совместимыми с макетами перечислениями или стандартными типами макета, совместимыми с макетами.

[class.mem] определяет классы, совместимые с макетами:

Два типа структуры стандартной компоновки - это классы, совместимые с макетами, если их общая начальная последовательность содержит все члены и битовые поля обоих классов ([basic.types]).

Если общая начальная последовательность:

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

Здесь первый член One (float x) не совместим с макетами с первым членом Two (float c[3]), поэтому общая начальная последовательность пуста.

Ответ 2

Компилятору разрешено добавлять дополнения между членами в class или struct.

Элементы массива находятся в смежных местах.

Они могут не соответствовать компоновке в зависимости от того, как компилятор организует элементы в struct.