uniones una tamaño sirve sintaxis saber que para estructuras estructura ejemplos como arreglo array c struct structure-packing

una - tamaño de la estructura en C



tamaño de un arreglo en c (4)

Posible duplicado:
¿Por qué no es sizeof para una estructura igual a la suma de sizeof de cada miembro?

Considere el siguiente código C:

#include <stdio.h> struct employee { int id; char name[30]; }; int main() { struct employee e1; printf("%d %d %d", sizeof(e1.id), sizeof(e1.name), sizeof(e1)); return(0); }

El resultado es:

4 30 36

¿Por qué el tamaño de la estructura no es igual a la suma de los tamaños de sus variables de componentes individuales?


Alinear a 6 bytes no es extraño, porque se está alineando a direcciones de múltiples a 4.

Así que, básicamente, tiene 34 bytes en su estructura y la próxima estructura debe colocarse en la dirección, que es múltiplo a 4. El valor más cercano después de 34 es 36. Y este área de relleno cuenta en el tamaño de la estructura.


Como se mencionó, el compilador de C agregará relleno para los requisitos de alineación. Estos requisitos a menudo tienen que ver con el subsistema de memoria. Algunos tipos de computadoras solo pueden acceder a la memoria alineada con algún valor ''bueno'', como 4 bytes. Esto a menudo es lo mismo que la longitud de la palabra. Por lo tanto, el compilador de C puede alinear los campos de su estructura con este valor para facilitar el acceso (por ejemplo, los valores de 4 bytes deben estar alineados en 4 bytes). Además, puede rellenar la parte inferior de la estructura para alinear los datos que siguen a la estructura . Creo que hay otras razones también. Más información se puede encontrar en this página wikipedia.


El compilador puede agregar relleno para los requisitos de alineación. Tenga en cuenta que esto se aplica no solo al relleno entre los campos de una estructura, sino que también puede aplicarse al final de la estructura (de modo que las matrices del tipo de estructura tendrán cada elemento alineado correctamente).

Por ejemplo:

struct foo_t { int x; char c; };

Aunque el campo c no necesita relleno, la estructura generalmente tendrá un sizeof(struct foo_t) == 8 (en un sistema de 32 bits, más bien un sistema con un tipo int 32 bits) porque será necesario 3 bytes de relleno después del campo c .

Tenga en cuenta que es posible que el sistema no requiera el relleno (como x86 o Cortex M3), pero los compiladores aún pueden agregarlo por motivos de rendimiento.


Su alineación predeterminada es probablemente de 4 bytes. O el elemento de 30 bytes obtuvo 32, o la estructura como un todo se redondeó al siguiente intervalo de 4 bytes.