Alineación y Relleno en Structs
Alineación
Cada campo de una estructura se alinea a un límite que es múltiplo del tamaño del elemento más grande de la estructura.
Por ejemplo, si el elemento más grande tiene un tamaño de 4 bytes, entonces cada elemento se alineará en un límite de 4 bytes.
Esto se realiza para acelerar el acceso a la memoria y evitar problemas de alineación de hardware.
main.c
1234567891011121314151617181920#include <stdio.h> // simple struct struct Example { char a; int b; double c; }; int main() { struct Example test; printf("Size of struct Example: %zu\n", sizeof(test)); printf("Address of test.x (char): %p\n", &test.a); printf("Address of test.y (int): %p\n", &test.b); printf("Address of test.c (double): %p\n", &test.c); return 0; }
Puede que te preguntes por qué el tamaño de struct Example es de 16 bytes, aunque cada campo esté alineado al límite del tipo más grande, que es de 8 bytes. A primera vista, alinear los tres campos a 8 bytes podría sugerir un tamaño total de 24 bytes. En realidad, funciona de manera un poco diferente.
El primer campo a es un char y ocupa 1 byte. Para asegurar que el siguiente campo b de tipo int comience en un límite de 4 bytes, el compilador agrega 3 bytes de relleno después de a. El campo b en sí ocupa 4 bytes y ahora está correctamente alineado.
El siguiente campo c es un double y necesita comenzar en un límite de 8 bytes. El compilador agrega relleno después de b para colocar c en la dirección correcta. El campo c ocupa 8 bytes.
En total: 1 byte para a + 3 bytes de relleno + 4 bytes para b + 8 bytes para c = 16 bytes. Se siguen las reglas de alineación y la memoria se utiliza de manera eficiente.
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla
Can you explain why the struct isn't 24 bytes if the largest element is 8 bytes?
How does padding work in structs with different data types?
Can you show an example of how the memory layout looks for this struct?
Genial!
Completion tasa mejorada a 4.35
Alineación y Relleno en Structs
Desliza para mostrar el menú
Alineación
Cada campo de una estructura se alinea a un límite que es múltiplo del tamaño del elemento más grande de la estructura.
Por ejemplo, si el elemento más grande tiene un tamaño de 4 bytes, entonces cada elemento se alineará en un límite de 4 bytes.
Esto se realiza para acelerar el acceso a la memoria y evitar problemas de alineación de hardware.
main.c
1234567891011121314151617181920#include <stdio.h> // simple struct struct Example { char a; int b; double c; }; int main() { struct Example test; printf("Size of struct Example: %zu\n", sizeof(test)); printf("Address of test.x (char): %p\n", &test.a); printf("Address of test.y (int): %p\n", &test.b); printf("Address of test.c (double): %p\n", &test.c); return 0; }
Puede que te preguntes por qué el tamaño de struct Example es de 16 bytes, aunque cada campo esté alineado al límite del tipo más grande, que es de 8 bytes. A primera vista, alinear los tres campos a 8 bytes podría sugerir un tamaño total de 24 bytes. En realidad, funciona de manera un poco diferente.
El primer campo a es un char y ocupa 1 byte. Para asegurar que el siguiente campo b de tipo int comience en un límite de 4 bytes, el compilador agrega 3 bytes de relleno después de a. El campo b en sí ocupa 4 bytes y ahora está correctamente alineado.
El siguiente campo c es un double y necesita comenzar en un límite de 8 bytes. El compilador agrega relleno después de b para colocar c en la dirección correcta. El campo c ocupa 8 bytes.
En total: 1 byte para a + 3 bytes de relleno + 4 bytes para b + 8 bytes para c = 16 bytes. Se siguen las reglas de alineación y la memoria se utiliza de manera eficiente.
¡Gracias por tus comentarios!