No entiedo porque el siguiente codigo imprime dos tamaños diferentes si ambos contienen la misma catidad de dato y de igual tipo
#include <stdio.h>
typedef struct
{
char a;
int b;
char c;
} A;
typedef struct
{
char a;
char c;
int b;
} B;
int main()
{
printf("%d\n", sizeof(A)); //Aqui me imprime 12
printf("%d\n", sizeof(B)); //Aqui me imprime 8
return 0;
}
Alguna idea de porque esta salida; el tamaño correcto no seria 6 bytes :huh:
Depende del compilador y banderas de compilacion asi como de la arquitectura.
Te puedo decir que el sistema por cuestion de alineamiento, en tu caso reservo en bloques de 4 bytes por variable,
Primer caso el de A
4 bytes para el primer char, 4 bytes para el int y otro 4 para el ultimo.
Ahora el cado de B, 4 bytes para los primeros 2 char y 4 bytes mas para el int.
al paracer le es más fácil acceder a un dato int en bloques de memoria divisibles por 4 pero habria que ver como trabaja el compilador internente para hacer eso.
Y si el tamaño optimo es 6 bytes
Saludos
Los compiladores alinean automaticamente los datos, insertando bytes de relleno para asegurar que cada miembro este alineado correctamente para un acceso mas rapido a ellos.
typedef struct
{
char a;
char relleno[3]; // para completar 4 bytes
int b;
char c;
char relleno[3]; //para completar 4 bytes
} A;
typedef struct
{
char a;
char c;
char relleno[2]; //para completar 4 bytes
int b;
} B;
Una instancia de una estructura tendra la alineacion de su miembre de mayor número bytes. Puedes evitar la alineación usando la directiva #pragma pack(1) pero no es recomendable porque podría tener un severo impacto en el rendimiento