Каждый компилятор C предлагает возможность «упаковать» структуры C (например __attribute__ ((__packed__))
, или #pragma pack()
). Теперь мы все знаем, что упаковка необходима, если мы хотим отправлять или хранить данные надежным способом. Это также должно быть требованием с первых дней языка Си.
Поэтому мне интересно, почему упакованные структуры не являются частью спецификации языка Си? Они даже не в C99 или C11, хотя необходимость их наличия известна в течение десятилетий? Чего мне не хватает? Почему это зависит от компилятора?
Ответы:
Я думаю, это потому, что это зависит от комбинации используемого процессора / компилятора. Это означает, что лучше быть директивой компилятора (как это связано с этим), чем языковым аспектом, потому что как это определить? Единственный способ, которым они могли бы сделать это, с союзом.
Статья Рэймонда дает некоторое представление о том, почему это так: http://www.catb.org/esr/structure-packing/
источник
Есть три основных фактора.
С учетом этих факторов как стандартный, так и все компиляторы C / C ++ обычно дополняют структуры, чтобы обеспечить оптимальное выравнивание для процессора, но также предоставляют механизмы для переопределения этого при необходимости для целей взаимодействия.
Это ни в коем случае не упущено из виду. Это очень хорошо понято, и текущая ситуация разработана. Последние версии стандарта C ++ имеют обширную поддержку для обработки проблем выравнивания, которые, возможно, вам не знакомы.
источник
Это зависит от компилятора, потому что это не в стандарте. И это не в стандарте, потому что было бы трудно указать таким способом, который не потребовал бы больших усилий по реализации для компиляторов неясных платформ с принудительными ограничениями выравнивания.
И ни одно из этих усилий не имеет большого оправдания, потому что каждый компилятор / платформа, о которой заботится любой, использующий компилятор C89 или новее, уже реализовал его.
источник
&
/|
для чтения / записи значений каждого поля.