2015-07-21 4 views
0

Я использую __attribute__((packed));, чтобы предметы из struct хранились в памяти за другой, поскольку это имеет решающее значение для некоторой разработки на низком уровне.
Как __attribute__((packed)); специфичен для GCC. Интересно, существует ли аналогичное решение, которое работает со всеми компиляторами ANSI/C89/C99/C11 или, по крайней мере, некоторыми из них.A __attribute __ ((упакованный)) как атрибут не GCC Конкретный

+5

Простой ответ: ** Нет **. Прочтите [стандарт] (http://port70.net/~nsz/c/c11/n1570.html). Но вы можете использовать условную компиляцию для создания кода, подходящего для разных компиляторов. OTOH, вопрос больше ** Почему ** вы хотите упаковать 'struct'. Если это для сериализации, это, вероятно, плохая идея. – Olaf

+0

Обратите внимание, что этот атрибут понимается в [GCC] (http://gcc.gnu.org/) и [Clang/LLVM] (http://clang.llvm.org/) –

+1

Обратите внимание, что использование атрибута, упакованного ' имеет тенденцию исключать эффективность - или, по крайней мере, вы торгуете (приобретаете) эффективность пространства за счет эффективности времени. Если вы не очень часто обращаетесь к структурам, это может иметь значение. Если вы делаете это много, возможно, это так. –

ответ

3

Нет стандартного подхода, чтобы выполнить то, что делает __attribute__((packed)). Типичным решением является использование #ifdef для обработки различных компиляторов. Вы можете найти несколько решений для этого подхода на этом SO post, который также содержит сведения о эквиваленте Visual C++ __attribute__((packed)). Альтернативно, GCC supports the Windows struct packing pragmas, поэтому, если вас интересуют только Windows и GCC, вы можете просто использовать подход Windows.

2

Нет поддержки функций для управления структурой структуры, указанной стандартом. В стандарте просто указывается, что этот аспект определяется реализацией.

Поэтому, если вам нужно управлять макетом, вам нужно будет использовать специфические для компилятора функции. Если вы можете найти способ избежать необходимости делать это вообще, это было бы предпочтительнее.