Tamaño de estructura varia con el orden de sus miembros

Iniciado por SebaC, 7 Junio 2016, 22:47 PM

0 Miembros y 1 Visitante están viendo este tema.

SebaC

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:

AlbertoBSD

#1
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
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

geeke

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