una son que punteros manejo los lenguaje funciones funcion estructuras estructura datos con arreglo c microcontroller packed

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".