2011-03-29 8 views
25

voy aunque algo de código C escrito para el compilador Microchip C30 y veo a menudo estructuras definidas de la siguiente manera:¿Qué es una estructura "empaquetada" en C?

typedef struct __attribute__((__packed__)) 
{ 
    IP_ADDR  MyIPAddr;    // IP address 
    IP_ADDR  MyMask;     // Subnet mask 
    IP_ADDR  MyGateway;    // Default Gateway 
     // etc... 
} APP_CONFIG; 

Lo que significa lleno?

Respuesta

47

Cuando se definen las estructuras, se permite que el compilador para agregar rellenos (espacios sin datos reales) para que los miembros caen en los límites de direcciones que son más fáciles de acceder para la CPU.

Por ejemplo, en una CPU de 32 bits, los miembros 32 bits deben comenzar en las direcciones que son múltiplo de 4 bytes con el fin de ser accedido de manera eficiente (leído y escrito). La siguiente definición de estructura agrega un relleno de 16 bits entre los dos miembros, de modo que el segundo miembro cae en una dirección límite adecuado:

struct S { 
    int16_t member1; 
    int32_t member2; 
}; 

La estructura en la memoria de la estructura anterior en una arquitectura de 32 bits es (~ = relleno):

+---------+---------+ 
| m1 |~~~~| m2 | 
+---------+---------+ 

Cuando una estructura se embala, estos rellenos no se insertan. El compilador debe generar más código (que se ejecuta más despacio) para extraer los miembros de datos no alineados y también para escribir en ellos.

La misma estructura, cuando contenga, aparecerá en la memoria como algo así como:

+---------+---------+ 
| m1 | m2 |~~~~ 
+---------+---------+ 
+0

Pregunta tangencial, pero ¿por qué crear una estructura empaquetada si hace las cosas más lentas? ¿Es para reducir la huella de memoria? – damned

3

Se indica al compilador que no añadir ningún relleno entre los miembros de la struct.

Véase, por ejemplo, this page.

+0

Supongo que te refieres a lo contrario: empacar significa omitir cualquier relleno y no agregarlo. – flolo

+0

@flolo Por supuesto. Gracias por señalar el error tipográfico. – NPE

+0

El enlace en esta respuesta está roto, ¿hay alguna posibilidad de solucionarlo? – Kev

1

_attribute__((__packed__)) significa (muy probablemente) "no inserte ningún relleno para hacer las cosas más rápido" y también puede significar "no inserte ninguna alineación para conservar la alineación".

Cuestiones relacionadas