Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprende Alineación y Relleno en Structs | Comprensión de Structs y Memoria
Dominio de las Estructuras en C

bookAlineació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

main.c

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

question mark

¿Por qué el tamaño de una struct a menudo excede la suma de los tamaños de sus campos individuales?

Select the correct answer

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 3. Capítulo 2

Pregunte a AI

expand

Pregunte a AI

ChatGPT

Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla

Suggested prompts:

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?

bookAlineació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

main.c

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

question mark

¿Por qué el tamaño de una struct a menudo excede la suma de los tamaños de sus campos individuales?

Select the correct answer

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 3. Capítulo 2
some-alt