#pragma pack(1)
garantiza que los elementos C struct
se empaquetan en orden y en los límites de bytes. Puede ahorrar RAM, lo que a menudo es valioso en un microcontrolador.
Las estructuras empaquetadas también permiten la conversión directa sobre memorias intermedias de memoria para el intercambio de datos:
void f(void *buf)
{
struct ip_header *hdr = (struct ip_header *)buf;
hdr->dst = 0x8000001;
}
Ten cuidado cuando usas #pragma pack
. Tiene un alcance global (ya que está en el preprocesador), por lo que olvidarse de desactivarlo afectará a cualquier archivo #include
.
Si solo quiere empacar ciertas estructuras, considere usar __attribute__ ((packed))
de GCC.
Sin embargo, debido a problemas de alineación, las estructuras empaquetadas pueden afectar el rendimiento.
Por ejemplo:
Cuando está empaquetado en bytes:
struct
{
uint8_t a;
uint32_t b;
uint8_t c;
uint8_t d:
};
Se almacenará como (sin tener en cuenta el endianness):
a, b0, b1, b2, b3, c, d
Sin embargo, muchas arquitecturas requieren que los accesos de 32 bits estén alineados con las direcciones de 32 bits. Con la estructura empaquetada, la máquina tendrá que hacer varios accesos de bytes y luego volver a unirlos nuevamente.
Frente al struct
anterior sin el empaque habilitado, el compilador podría reorganizarlo como:
b0, b1, b2, b3, a, c, d