2011-03-29 2 views
25

Я собираюсь хотя некоторые C код, написанный для компилятора Microchip C30, и я часто вижу структур определяются следующим образом:Что такое «упакованная» структура в C?

typedef struct __attribute__((__packed__)) 
{ 
    IP_ADDR  MyIPAddr;    // IP address 
    IP_ADDR  MyMask;     // Subnet mask 
    IP_ADDR  MyGateway;    // Default Gateway 
     // etc... 
} APP_CONFIG; 

Что упакована значит?

ответ

47

Когда структуры определены, компилятору разрешено добавлять paddings (пробелы без фактических данных), чтобы члены попадали в границы адресов, которые легче получить для CPU.

Например, на 32-разрядном процессоре 32-разрядные элементы должны начинаться с адресов, кратных 4 байтам, для обеспечения эффективного доступа (чтение и запись). Следующее определение структуры добавляет 16-битные отступы между обеими членами, так что второй элемент попадет в соответствующем адресе границе:

struct S { 
    int16_t member1; 
    int32_t member2; 
}; 

структура в памяти указанной выше структуры в 32-битной архитектуре является (~ = обивка):

+---------+---------+ 
| m1 |~~~~| m2 | 
+---------+---------+ 

Когда конструкция упакована, эти прокладки не вставлены. Компилятор должен генерировать больше кода (который работает медленнее) для извлечения неприсоединившихся элементов данных, а также для их записи.

Та же структура, при упаковке появится в памяти как что-то вроде:

+---------+---------+ 
| m1 | m2 |~~~~ 
+---------+---------+ 
+0

Тангенциальный вопрос, но зачем создавать упакованную структуру, если это замедляет работу? Уменьшить объем памяти? – damned

3

Это инструктирует компилятор не добавляет отступы между членами struct.

См., Например, this page.

+0

Я предполагаю, что вы имеете в виду противоположное - упакованное означает опустить любое дополнение и не добавлять его. – flolo

+0

@flolo Конечно. Спасибо, что указали на опечатку. – NPE

+0

Ссылка в этом ответе сломана, любой шанс исправить? – Kev

1

_attribute__((__packed__)) означает (скорее всего) «не вставлять какие-либо отступы, чтобы ускорить работу», а также означает «не вставляйте выравнивания для сохранения выравнивания».

Смежные вопросы