lguien puede explicarme por que si son iguales uno es de 16 y el otro de 12

Iniciado por Tito_2017, 30 Agosto 2017, 00:16 AM

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

Tito_2017

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
-Engel Lex

AlbertoBSD

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.

struct a {
int xi; //4 Bytes toma 4 bytes
char n; //1 Bytes pero lo Alinea a 4 bytes
int y; //4 Bytes toma 4 bytes
char m; //1 Bytes pero lo Alinea a 4 bytes
}

Total 16 Bytes Y para el otro ejemplo

struct b {
int xi; //4 Bytes toma 4 bytes
int y; //4 Bytes toma 4 bytes
char n; //1 Bytes
char m; //1 Bytes pero alinea los 2 ultimos a 4 bytes
}

Total 12 bytes
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

ivancea96

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 (cpp) [Seleccionar]
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:

|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.