Я использую __attribute__((packed));
, чтобы предметы из struct
хранились в памяти за другой, поскольку это имеет решающее значение для некоторой разработки на низком уровне.
Как __attribute__((packed));
специфичен для GCC. Интересно, существует ли аналогичное решение, которое работает со всеми компиляторами ANSI/C89/C99/C11 или, по крайней мере, некоторыми из них.A __attribute __ ((упакованный)) как атрибут не GCC Конкретный
ответ
Нет стандартного подхода, чтобы выполнить то, что делает __attribute__((packed))
. Типичным решением является использование #ifdef
для обработки различных компиляторов. Вы можете найти несколько решений для этого подхода на этом SO post, который также содержит сведения о эквиваленте Visual C++ __attribute__((packed))
. Альтернативно, GCC supports the Windows struct packing pragmas, поэтому, если вас интересуют только Windows и GCC, вы можете просто использовать подход Windows.
Нет поддержки функций для управления структурой структуры, указанной стандартом. В стандарте просто указывается, что этот аспект определяется реализацией.
Поэтому, если вам нужно управлять макетом, вам нужно будет использовать специфические для компилятора функции. Если вы можете найти способ избежать необходимости делать это вообще, это было бы предпочтительнее.
Простой ответ: ** Нет **. Прочтите [стандарт] (http://port70.net/~nsz/c/c11/n1570.html). Но вы можете использовать условную компиляцию для создания кода, подходящего для разных компиляторов. OTOH, вопрос больше ** Почему ** вы хотите упаковать 'struct'. Если это для сериализации, это, вероятно, плохая идея. – Olaf
Обратите внимание, что этот атрибут понимается в [GCC] (http://gcc.gnu.org/) и [Clang/LLVM] (http://clang.llvm.org/) –
Обратите внимание, что использование атрибута, упакованного ' имеет тенденцию исключать эффективность - или, по крайней мере, вы торгуете (приобретаете) эффективность пространства за счет эффективности времени. Если вы не очень часто обращаетесь к структурам, это может иметь значение. Если вы делаете это много, возможно, это так. –