¿Cómo funciona el relleno en la estructura?

La salida de este progtwig es 28. No entiendo cómo? Según yo, esto debería ser 32 (4 + 4 + 4 + 4 + 12) +4 (para mantener la alineación) = 32. Por favor explique la razón para mostrar la salida 28 ??

struct test{ char c; int d; int x; int y; long double p; }t1; printf("%d",sizeof(t1)); 

Tal vez su “doble largo” sea en realidad lo mismo que un doble (8 bytes), y si está en un procesador de 32 bits, la alineación es de 4 bytes.

4 + 4 + 4 + 4 + 8 = 24

¿Qué es sizeof(long double) ?

EDITAR:

__builtin_offset_of() y __alignof__ de __alignof__ para investigar. La respuesta real que explica el tamaño de la estructura es:

4 + 4 + 4 + 4 + 12 = 28

sizeof(long double) es 12.

No es necesario __alignof__(long double) porque __alignof__(long double) es 4 y. Curiosamente, __alignof__(double) es 8.

En un sistema de 64 bits, los tamaños son char – 1 byte (no 4 bytes) int – 4 bytes de longitud doble – 12 bytes

así que el total es 1 + 4 + 4 + 4 + 12 + relleno = 28 bytes !!

De acuerdo con esto , los duplicados largos en el modo gcc de 32 bits (utilizando gcc -m32 o con un gcc que fue creado para producir una salida de 32 bits, independientemente de lo que realmente sea su plataforma) solo están alineados a 4 bytes. Sin embargo, podría ser bueno consultar el manual de gcc para verificarlo.

Eso me parece correcto. Un campo que sigue a p se alinearía con 4 bytes, por lo que no es necesario rellenar el extremo de la estructura.

4 + 4 + 4 + 4 + 12 = 28

En mi sistema, la salida es 32, pero en mi sistema, sizeof (long double) es 16. (x86_64, LLVM3).

La salida de sizeof 28 es, por supuesto, correcta = 1 byte para char, 3 bytes de relleno, 3 x 4 int y 12 bytes para doble largo (96 bits de tamaño pero 80 bits de precisión), lo que hace un total de 28 bytes.

Recuerde que aunque compile en la máquina x86-64, probablemente compile para la máquina x86-32 usando mingw32 y eso hace una diferencia.

Mingw32 usa una alineación de 4 bytes para el long double .