son - ¿Qué es una estructura "empaquetada" en C?
que es una estructura en c++ (3)
Estoy revisando un código C escrito para el compilador Microchip C30 y a menudo veo estructuras definidas de la siguiente manera:
typedef struct __attribute__((__packed__))
{
IP_ADDR MyIPAddr; // IP address
IP_ADDR MyMask; // Subnet mask
IP_ADDR MyGateway; // Default Gateway
// etc...
} APP_CONFIG;
¿Qué significa empaquetado?
Cuando se definen las estructuras, al compilador se le permite agregar rellenos (espacios sin datos reales) para que los miembros entren en los límites de las direcciones a los que es más fácil acceder para la CPU.
Por ejemplo, en una CPU de 32 bits, los miembros de 32 bits deben comenzar en direcciones que tienen múltiplos de 4 bytes para poder acceder (leer y escribir) de manera eficiente. La siguiente definición de estructura agrega un relleno de 16 bits entre ambos miembros, de modo que el segundo miembro se encuentra en un límite de dirección adecuado:
struct S {
int16_t member1;
int32_t member2;
};
La estructura en memoria de la estructura anterior en una arquitectura de 32 bits es ( ~ = relleno):
+---------+---------+
| m1 |~~~~| m2 |
+---------+---------+
Cuando una estructura está empaquetada, estos rellenos no se insertan. El compilador tiene que generar más código (que se ejecuta más lento) para extraer los miembros de datos no alineados, y también para escribir en ellos.
La misma estructura, cuando se empaqueta, aparecerá en la memoria como algo así como:
+---------+---------+
| m1 | m2 |~~~~
+---------+---------+
Le indica al compilador que no agregue ningún relleno entre los miembros de la struct
.
Ver, por ejemplo, esta página .
_attribute__((__packed__))
significa (probablemente) "no inserte ningún relleno para hacer las cosas más rápidas" y también puede significar "no inserte ninguna alineación para preservar la alineación".