Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: SebaC en 7 Junio 2016, 22:47 pm



Título: Tamaño de estructura varia con el orden de sus miembros
Publicado por: SebaC en 7 Junio 2016, 22:47 pm
No entiedo porque el siguiente codigo imprime dos tamaños diferentes si ambos contienen la misma catidad de dato y de igual tipo

Código
  1. #include <stdio.h>
  2.  
  3. typedef struct
  4. {
  5.    char a;
  6.    int b;
  7.    char c;
  8. } A;
  9.  
  10. typedef struct
  11. {
  12.    char a;
  13.    char c;
  14.    int b;
  15. } B;
  16.  
  17. int main()
  18. {
  19.    printf("%d\n", sizeof(A)); //Aqui me imprime 12
  20.    printf("%d\n", sizeof(B)); //Aqui me imprime 8
  21.    return 0;
  22. }

Alguna idea de porque esta salida; el tamaño correcto no seria 6 bytes  :huh:


Título: Re: Tamaño de estructura varia con el orden de sus miembros
Publicado por: AlbertoBSD en 7 Junio 2016, 23:38 pm
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


Título: Re: Tamaño de estructura varia con el orden de sus miembros
Publicado por: geeke en 8 Junio 2016, 00:24 am
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.

Código
  1. typedef struct
  2. {
  3.    char a;
  4.    char relleno[3]; // para completar 4 bytes
  5.    int b;
  6.    char c;
  7.    char relleno[3]; //para completar 4 bytes
  8. } A;
  9.  
  10. typedef struct
  11. {
  12.    char a;
  13.    char c;
  14.    char relleno[2]; //para completar 4 bytes
  15.    int b;
  16. } 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