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