#pragma pack
indica al compilador que empaquete los miembros de la estructura con una alineación particular. La mayoría de los compiladores, al declarar una estructura, insertarán relleno entre los miembros para asegurarse de que estén alineados con las direcciones apropiadas en la memoria (generalmente un múltiplo del tamaño del tipo). Esto evita la penalización del rendimiento (o error absoluto) en algunas arquitecturas asociadas con el acceso a variables que no están alineadas correctamente. Por ejemplo, dada 4 bytes enteros y la siguiente estructura:
struct Test
{
char AA;
int BB;
char CC;
};
El compilador podría optar por poner la estructura en la memoria de esta manera:
| 1 | 2 | 3 | 4 |
| AA(1) | pad.................. |
| BB(1) | BB(2) | BB(3) | BB(4) |
| CC(1) | pad.................. |
y sizeof(Test)
habría 4 × 3 = 12 , a pesar de que solo contiene 6 bytes de datos. El caso de uso más común para el #pragma
(que yo sepa) es cuando se trabaja con dispositivos de hardware donde necesita asegurarse de que el compilador no inserta relleno en los datos y cada miembro sigue el anterior. Con #pragma pack(1)
, la estructura anterior se presenta como esto:
| 1 |
| AA(1) |
| BB(1) |
| BB(2) |
| BB(3) |
| BB(4) |
| CC(1) |
Y sizeof(Test)
habría × 1 6 = 6.
Con #pragma pack(2)
, la struct anterior sería diseñada como este:
| 1 | 2 |
| AA(1) | pad.. |
| BB(1) | BB(2) |
| BB(3) | BB(4) |
| CC(1) | pad.. |
Y sizeof(Test)
habría 2 × 4 = 8.
Fuerza una alineación particular/embalaje de una estructura, pero al igual que todas las directivas pragma' # 'que son definidos por la implementación. – dreamlax
'A mod s = 0' donde A es la dirección ys es el tamaño del tipo de datos; esto verifica si los datos no están desalineados. – legends2k