В C компилятор выведет членов структуры в том порядке, в котором они объявлены, с возможными байтами заполнения, вставленными между членами или после последнего члена, чтобы гарантировать, что каждый элемент правильно выровнен.
gcc предоставляет языковое расширение, __attribute__((packed))
, которое сообщает компилятору не вставлять дополнения, позволяя членам структуры смещаться. Например, если система обычно требует, чтобы все объекты int
имели 4-байтовое выравнивание, __attribute__((packed))
может вызывать элементы структуры int
для нечетных смещений.
Указание документации gcc:
Атрибут "упакованный" указывает, что поле переменной или структуры должен иметь наименьшее возможное выравнивание - один байт для переменной, и один бит для поля, если вы не укажете большее значение с `aligned '.
Очевидно, что использование этого расширения может привести к меньшим требованиям к данным, но более медленному коду, поскольку компилятор должен (на некоторых платформах) генерировать код для доступа к несогласованному члену байта за раз.
Но есть ли случаи, когда это небезопасно? Всегда ли компилятор генерирует правильный (хотя и медленный) код для доступа к несогласованным членам упакованных структур? Возможно ли вообще это сделать во всех случаях?