Cuando declara una estructura, la mayoría de los compiladores insertan bytes de relleno entre los miembros para asegurarse de que estén alineados con las direcciones apropiadas en la memoria (generalmente los bytes de relleno son un múltiplo del tamaño del tipo). Esto permite que el compilador tenga un acceso optimizado para obtener estos miembros.
#pragma pack(1)
indica al compilador que empaquete los miembros de la estructura con una alineación particular. El 1
aquí le dice al compilador que no inserte ningún relleno entre los miembros.
Así Sí, hay una penalización en el rendimiento definitivo, ya que se fuerza al compilador que hacer algo más allá de lo que lo haría de forma natural para optimization.Also rendimiento, algunas plataformas exigencia de que los objetos estén alineados en los límites específicos y el uso de unalighed las estructuras pueden darte fallas de segmentación.
Idealmente, es mejor evitar cambiar las reglas de alineación natural predeterminadas. Pero si la directiva 'pragma pack' no se puede evitar en absoluto (como en su caso), entonces el esquema de empaque original debe restaurarse después de la definición de las estructuras que requieren un empaque ajustado.
Por ejemplo:
//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)
Ni siquiera sabía que GCC es compatible con '#pragma pack'. No es que vaya a usarlo ahora. –
@larsmans Sí lo hace, debido a Windows: http://gcc.gnu.org/onlinedocs/gcc/Structure_002dPacking-Pragmas.html – Nicolas