Estructura de Sizeof en C

Para encontrar el tamaño de una estructura en C

 estudiante estructurado
     {
      nombre del personaje;
      edad int
      peso del flotador
     }; 

principal ()
{
int i, j, k, l;
struct student s1;
i = sizeof (s1.name);
j = sizeof (s1.age);
k = sizeof (s1.weight);
l = sizeof (s1);
printf (“\ n tamaño del nombre% d”, i);
printf (“\ n tamaño de edad% d”, j);
printf (“\ n tamaño del peso% d”, k);
printf (“\ n tamaño de s1% d”, l);

printf("\n"); }

Mi salida es:

size of name 1 size of age 4 size of weight 4 size of s1 12

Pero el tamaño de la estructura debe ser la sum de los tamaños de sus miembros. ¿Por qué obtengo 12 en lugar de 9 como tamaño de la variable de estructura s1? ¿Alguien puede explicar lo que está mal?

Por razones de rendimiento o hardware, los campos en las estructuras deben estar adecuadamente alineados. Lea sobre la alineación de la estructura de datos (los detalles dependen del procesador de destino y el ABI ).

En su ejemplo en x86-64 / Linux:

 struct student { char name; int age; float weight; }; 

El name del campo no tiene ningún requisito de alineación. la age del campo necesita 4 bytes alineados a un múltiplo de 4, el weight del campo necesita 4 bytes alineados a un múltiplo de 4

por lo tanto, la struct student general del struct student necesita 12 bytes alineados a un múltiplo de 4

Si el weight se declarara double , se necesitarían 8 bytes alineados con un múltiplo de 8, y toda la estructura necesitaría 16 bytes alineados con 8.

Por cierto, el tipo de su campo de name es incorrecto. Por lo general, los nombres son más de un solo carácter. (Mi apellido necesita 13 letras + el byte nulo de terminación, es decir, 14 bytes). Probablemente deberías declararlo un puntero char *name; (8 bytes alineados a 8) o una matriz, por ejemplo, char name[16]; (16 bytes alineados a 1 byte).

El comstackdor GCC proporciona una extensión agradable: __alignof__ y atributos de tipo relevantes.

Si el rendimiento o el tamaño son importantes para usted, debe poner los campos en orden para disminuir los requisitos de alineación (por lo general, comience con los campos double , luego los long y los punteros, etc.)