Когда структуры определены, компилятору разрешено добавлять paddings (пробелы без фактических данных), чтобы члены попадали в границы адресов, которые легче получить для CPU.
Например, на 32-разрядном процессоре 32-разрядные элементы должны начинаться с адресов, кратных 4 байтам, для обеспечения эффективного доступа (чтение и запись). Следующее определение структуры добавляет 16-битные отступы между обеими членами, так что второй элемент попадет в соответствующем адресе границе:
struct S {
int16_t member1;
int32_t member2;
};
структура в памяти указанной выше структуры в 32-битной архитектуре является (~ = обивка):
+---------+---------+
| m1 |~~~~| m2 |
+---------+---------+
Когда конструкция упакована, эти прокладки не вставлены. Компилятор должен генерировать больше кода (который работает медленнее) для извлечения неприсоединившихся элементов данных, а также для их записи.
Та же структура, при упаковке появится в памяти как что-то вроде:
+---------+---------+
| m1 | m2 |~~~~
+---------+---------+
Тангенциальный вопрос, но зачем создавать упакованную структуру, если это замедляет работу? Уменьшить объем памяти? – damned