login
Inicia sessió

register
Registra't

El blog del Dani

L'art en el model i ús de memòria de C++

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)

Comentaris (0)15-08-2011 23:49:24Programació

Escriu un nou comentari:

Comentari extern

Nom:


Registrar-me a flog.cat

Usuaris registrats

Usuari de flog.cat:

Contrasenya: