Есть ли какие-либо гарантии относительно упаковки 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 более подробно рассказывается об этом.