Nuestro equipo de trabajo ha estado largas horas buscando la solución a tus interrogantes, te compartimos la respuestas así que nuestro deseo es servirte de mucha apoyo.
Solución:
Al menos en la mayoría de las máquinas, un tipo solo se alinea con un límite tan grande como el propio tipo. [Edit: you can’t really demand any “more” alignment than that, because you have to be able to create arrays, and you can’t insert padding into an array]. En su implementación, short
aparentemente es de 2 bytes, y int
4 bytes.
Eso significa que su primera estructura está alineada con un límite de 2 bytes. Dado que todos los miembros tienen 2 bytes cada uno, no se inserta relleno entre ellos.
El segundo contiene un elemento de 4 bytes, que se alinea con un límite de 4 bytes. Dado que está precedido por 6 bytes, se insertan 2 bytes de relleno entre v3
y i
, dando 6 bytes de datos en el short
s, dos bytes de relleno y 4 bytes más de datos en el int
para un total de 12.
Olvídese de tener diferentes miembros, incluso si escribe dos estructuras cuyos miembros son exactamente lo mismo con una diferencia es que el orden en que se declaran es diferente, entonces el tamaño de cada estructura puede ser (y a menudo es) diferente.
Por ejemplo, mira esto,
#include
using namespace std;
struct A
char c;
char d;
int i;
;
struct B
char c;
int i; //note the order is different!
char d;
;
int main()
cout << sizeof(A) << endl;
cout << sizeof(B) << endl;
compilarlo con gcc-4.3.4
, y obtienes este resultado:
8
12
Es decir, los tamaños son diferentes aunque ambas estructuras tengan los mismos miembros.
Código en Ideone: http://ideone.com/HGGVl
La conclusión es que el Estándar no habla sobre cómo se debe hacer el relleno, por lo que los compiladores son libres de tomar cualquier decisión y usted no puede suponga que todos los compiladores toman la misma decisión.
De forma predeterminada, los valores se alinean según su tamaño. Así que un valor de 2 bytes como un short
está alineado en un límite de 2 bytes y un valor de 4 bytes como un int
está alineado en un límite de 4 bytes
En su ejemplo, se agregan 2 bytes de relleno antes i
para asegurar eso i
cae en un límite de 4 bytes.
(Toda la estructura está alineada en un límite al menos tan grande como el valor más grande de la estructura, por lo que su estructura se alineará en un límite de 4 bytes).
Las reglas reales varían según la plataforma: la página de Wikipedia sobre la alineación de la estructura de datos tiene más detalles.
Los compiladores generalmente le permiten controlar el empaque a través de (por ejemplo) #pragma pack
directivas.