Когда вы объявляете структуру, большинство компиляторов вставляют байты заполнения между членами, чтобы гарантировать, что они выровнены по соответствующим адресам в памяти (обычно байты заполнения кратны размеру типа). Это позволяет компилятору оптимизировать доступ к этим элементам.
#pragma pack(1)
указывает компилятору упаковать элементы структуры с определенным выравниванием. 1
здесь говорит компилятору не вставлять какие-либо отступы между членами.
Так что да, есть определенное снижение производительности , так как вы заставляете компилятор делать что-то помимо того, что он обычно делает для оптимизации производительности. Также, некоторые платформы требуют выравнивания объектов в специфические границы и использование невыровненных структур могут привести к ошибкам сегментации.
В идеале лучше избегать изменения правил естественного выравнивания по умолчанию. Но если директивы «Прагма-упаковка» вообще нельзя избежать (как в вашем случае), то после определения структур, требующих плотной упаковки, необходимо восстановить первоначальную схему упаковки.
Например:
//push current alignment rules to internal stack and force 1-byte alignment boundary
#pragma pack(push,1)
/* definition of structures that require tight packing go in here */
//restore original alignment rules from stack
#pragma pack(pop)