Alineado de memoria en C

1 min

Bueno, hay un tema que hace tiempo lo había estudiado y resulta que ahora me estaba pasando lo mismo y no me acordaba exactamente que era. Para ubicarnos, un código C, uso de una estructura y un sizeof que devuelve cualquier “verdura”. Veamos, este es el ejemplo:

struct page_idx
{
    char app[4];    4 bytes
    char nose[2];   2 bytes
    long page_no;   4 bytes
    long page_pos;  4 bytes
};

Se supone que esto debería dar 14, sin embargo compilándolo con el Gcc, el sizeof me da 16 bytes???. El tema es la alineación de las estructuras que usa el compilador, básicamente la idea es mejorar la performance de acceso a la memoria, para hacer esto, las estructuras se almacenan en bloques de memoria que sean múltiplos del elemento de mayor tamaño, en este ejemplo 4 bytes, por lo que la estructura final ocuparía 16 bytes. Esto no debería ser ningún problema si la estructura la creamos y la usamos en memoria, pero en el momento que necesitamos usarla para acceder a un registro en un archivo, la cosa se complica. La solución es “avisarle” al compilador que no haga ninguna alineación, a mi gusto la mejor forma es declarar la estructura así:

struct page_idx
{
    char app[4];    4 bytes
    char nose[2];   2 bytes
    long page_no;   4 bytes
    long page_pos;  4 bytes
}__attribute__ ((packed));

Y eso es todo..//


Si te gustó o te resulto útil lo que has leído y tienes las ganas de colaborar con el autor, puedes hacerlo a través:

@pmoracho QR code
https://pmoracho.github.io/blog/2016/10/11/Alineado-de-memoria-en-C/
11-Oct-16
BY-NC-SA 4.0 https://pmoracho.github.io/disclosure
https://pmoracho.github.io/blog/2016/10/11/Alineado-de-memoria-en-C/