Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Tito_2017 en 30 Agosto 2017, 00:16 am



Título: lguien puede explicarme por que si son iguales uno es de 16 y el otro de 12
Publicado por: Tito_2017 en 30 Agosto 2017, 00:16 am
struct a                                                         struct b

{ int xi;                                                        { int xi;

  char n;                                                         int y;

   int y;                                                           char n;

   char m;    }                                                 char m; }

    

Sizeof (a) = 16 bytes                               Sizeof (b) = 12 bytes
Alguien puede explicarme por que si son iguales uno es de 16 y el otro de 12?


· Los titulos deben ser descriptivos a la temática (no es descriptivo colocar "programación c++" en un subforo de programación en c++)
>aquí las reglas del foro (http://foro.elhacker.net/reglas.htm)
-Engel Lex


Título: Re: lguien puede explicarme por que si son iguales uno es de 16 y el otro de 12
Publicado por: AlbertoBSD en 30 Agosto 2017, 00:29 am
Es por cuestion de Alineacion de los datos.

Int (4 bytes)
char (1 byte)

Pero la computadora tiene preferencia de siempre terminar alinear a cada 4 bytes (Esto cambia mucho) dependiendo del sistema y compilador que uses. Ejemplo.

Código
  1. struct a {
  2. int xi; //4 Bytes toma 4 bytes
  3. char n; //1 Bytes pero lo Alinea a 4 bytes
  4. int y; //4 Bytes toma 4 bytes
  5. char m; //1 Bytes pero lo Alinea a 4 bytes
  6. }
  7.  
Total 16 Bytes Y para el otro ejemplo

Código
  1. struct b {
  2. int xi; //4 Bytes toma 4 bytes
  3. int y; //4 Bytes toma 4 bytes
  4. char n; //1 Bytes
  5. char m; //1 Bytes pero alinea los 2 ultimos a 4 bytes
  6. }
  7.  
Total 12 bytes


Título: Re: lguien puede explicarme por que si son iguales uno es de 16 y el otro de 12
Publicado por: ivancea96 en 30 Agosto 2017, 00:41 am
Tema de alineamiento de los bytes.
int: 4 bytes
char: 1 byte

Normalmente, salvo que se lo especifiques explícitamente... (poniendo algo como esto en elc aso de GCC):
Código
  1. struct a {} __attribute__ ((packed));

... los campos de la estructura se "alinearán" y agregarán bytes sin uso entre ellos. En tu caso, la alineación por defecto es de 4 bytes. Esto se entiende mejro con un ejemplo, usando tu estructura A:

Código:
|0|1|2|3|4|5|6|7|8|9|A|B|C|D|E|F|
|x|x|x|x|n|_|_|_|y|y|y|y|m|_|_|_|

La idea es que, en memoria, quede todo alineado y no haya direcciones de memoria "extrañas" como "0xF1". Normalmente, múltiplos de 4.

En definitiva, una optimización.