Есть ли какие-либо гарантии относительно упаковки C struct?

Есть ли какие- либо гарантии относительно упаковки конструкций в C?

Просто в качестве примера, при условии, что sizeof(double) == 8Гарантируется ли, что sizeof(struct { double x, y; }) == 16?

Мне известно, что намерение, стоящее за этим вопросом, противоречит строгим правилам алиасинга, поэтому предположим, что строгое алиасирование отключено, например, в случае gcc с -fno-strict-aliasing,

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

1 ответ

Решение

Единственное, что стандарт C говорит о структурной упаковке, это то, что в начале struct, Он не дает никаких гарантий относительно заполнения полей или в конце.

Раздел 6.7.2.1 стандарта C говорит следующее относительно структур:

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

...

17 Там может быть безымянный отступ в конце структуры или объединения.

При этом большинство реализаций, как правило, достаточно совместимы с тем, как упакованы структуры. Неструктурные переменные n байты в размере (или массивы таких переменных) будут иметь тенденцию начинаться на n граница байта. Структура в структуре будет иметь тенденцию выравниваться на основе выравнивания ее подполей.

В Lost Art of C Structure Pack более подробно рассказывается об этом.

Другие вопросы по тегам