Imaginem la següent estructura de dades definida en el llenguatge C++:
struct T {
char a;
int b:5,
c:11,
:0,
d:8;
struct {int ee:8;} e;
};
És correcta? Compila?
Sí, és correcta. En primer lloc conté un byte de tipus caracter (a). A continuació, té una reserva de memòria conjunta per les variables b i c, de 5 bits i 11 bits respectivament, internament contingudes en un mateix registre referenciat de 2 bytes, gràcies a la part del :0 que veurem explicada més endavant per què serveix. A continuació, altra reserva per a un enter, amb 1 byte (8 bytes) per la variable d i altre byte per la "subestructura" e, que dins conté un int de 8 bits.
Quants espais de memòria ocupa?
Com hem vist, té quatre ubicacions de memòria, o referències. Les variables a, d i ee ocupen posicions de memòria separades. Les variables b i c constitueixen la quarta posició de memòria.
Quant ocupa en memòria (sizeof)?
Ocupa 12 bytes. La variable a ocupa 1 byte (tipus char), b i c comparteixen els 4 bytes (32 bits) del int, degut al ":0", que impedeix que la d es contingua amb la b i la c fins que s'emplenaren els 32 bits del int. Així doncs, la d i e ocupen cadascuna 4 bytes. En total, 12 bytes.
Poden ser modificats simultàniament els valors de l'struct?
Per exemple, b i c no podrien ser modificades simultàniament (concurrentment, per dos threads). Per exemple, les variables e i d sí que podrien (usen espais de memòria diferents).
Quant ocupa la següent estructura en memòria?
struct T2 {
int a;
int b:6,c:12;
int d:4;
};
T2::a ocupa els 4 bytes d'un enter.
T2::b i T2::c ocupen 18 bits.
T2::d ocupa 4 bits, però en memòria es guarda a continuació de b i c, perquè b i c no emplenen els 32 bits de l'enter declarat.
Per tant, ocupa 8 bytes (4 B contenint la variable a i 4 B contenint les variables b, c i d). En resum, sizeof(T2) = 8.
I si ho canviem afegint un :0?
L'estructura quedaria així:
struct T3 {
int a;
int b:6,c:12,:0;
int d:4;
};
T3::a segueix ocupant per si sol els 4 bytes del int.
T3::b i T3::c ocupen 18 bits.
T3::d ocupa 4 bits.
Al haver-hi el :0 a continuació de la c, la variable d no es pot guardar a continuació de b i c, això força una nova reserva de memòria. Per tant, b i c estaran continguts en un espai de 4 bytes del int declarat i d ocuparà també altre espai de 4 bytes. En resum, sizeof(T3) = 12.
Tornant a l'exemple inicial, la variable e, al ser una estructura, no es podria contindre dins del espai de b, c i d si no hi hagués el ":0"
struct T4 {
char a;
int b:5,
c:11,
d:8;
struct {int ee:8;} e;
};
sizeof(T4) = 8 (a = 1 byte, b,c,d = 3 bytes, e = 4 bytes)