Эта директива используется для указания компилятору различных параметров. Эти параметры зависят от платформы и используемого компилятора. Обратитесь к руководству или справочнику вашего компилятора для получения дополнительной информации о возможных параметрах, которые вы можете определить с помощью #pragma. Если компилятор не поддерживает конкретный аргумент для #pragma, он игнорируется - ошибка не генерируется.

Компилятор, если не указано иное, выстраивает элементы структуры по 2-байтовым или 4-байтовым границам - это упрощает и ускоряет обработку процессором. Здесь структура содержит секретные байты заполнения, чтобы это произошло. Директива pragma pack позволяет вам изменить эту схему выравнивания. Некоторые вещи (особенно в отношении аппаратного обеспечения и встроенного программирования, такого как робототехника, телекоммуникации) не могут позволить себе тратить такие байты, и они отправляют свои данные в точном соответствии. Это означает, что читать данные с аппаратного устройства напрямую в нормальную структуру неразумно. Если вы хотите читать данные, которые точно вписываются в структуру - вы можете указать компилятору сделать структуру точно такой же;

#pragma pack(push, 1) // exact fit - no padding
struct MyStruct
{
  char b; 
  int a; 
  int array[2];
};
#pragma pack(pop) //back to whatever the previous packing mode was

Без директивы pragma размер структуры составляет 16 байтов - с упаковкой 1 - размер составляет 13 байтов.