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 |~~~~
+---------+---------+
Pregunta tangencial, pero ¿por qué crear una estructura empaquetada si hace las cosas más lentas? ¿Es para reducir la huella de memoria? – damned