Cimpuri
Atunci cind spatiul de memorare estre la mare pret, poate fi
necesar ca mai multe obiecte sa fie impachetate intr-un singur
cuvint masina; un caz adesea folosit este compactarea
fanioanelor de un singur bit necesare in aplicatii catabelele de
simboluri ale compilatoarelor. Formatele externe impuse de
interfetele cu diversele echipamente externe, adesea impun
compactrea datelor pe un cuvint.
Sa ne imaginam un fragment dintr-un compilator care
manipuleaza o tabela de simboluri. Fiecare identificator dintr-
un program are anumite informatii asociate, de exemplu, este
sau nu un cuvint cheie, e este sau nu extern si/sau static, s. a.
m. d. Cel mai compact mod de a coda astfel de informatii este un
set de fanioane de un bit cuprinse intr-un "char" sau "int".
Modul cel mai uzual este de a defini un set de masti
corespunzatoare pozitiilor cu biti semnificativi, ca in
#define KEYWORD 01
#define EXTERNAL 02
#define STATIC 04
(Numele trebuie sa fie puteri ale lui doi.) Apoi accesul la biti
devine un soi de "bitareala" cu operatori de permutare,
mascare si complementare, care au foat descrisi in capitolul 2.
Anumite idioame apar frecvent:
flags != EXTERNAL ! STATIC;
valideaza bitii EXTERNAL si STATIC ca fanioane, in timp ce
flags &= (EXTERNAL ! STATIC);
ii invalideaza.
Desi aceste idioame sint cu usurinta manevrate, limbajul C, mai
degraba ofera capacitatea preferabila de adefini si accesa
cimpuri Un cimp este un set de biti adiacenti cuprinsi intr-un
singur "int". Sintaxa de definire si accesul cimpurilor este
bazata pe structuri. De exemplu tabela de simboluri definita mai
sus ar putea fi inlocuita printr-o definire a trei cimpuri.
struct flags;
Este astfel definita o variabila numita "flags" care contine
trei cimpuri de cite un bit. Numarul de dupa ":"
reprezinta lungimea cimpului in biti. Cimpurile sint declarate
fara semn (unsigned) tocmai pentru a accentua ca sint cantitati
fara semn.
Cimpurile individuale sint referite ca "flags.is_keyword",
"flags.is_extern", etc, la fel ca oricare alti me, bri ai
structurii. Cimpurile se comporta ca niste mici intregi fara semn
si pot participa in expresii aritmetice la fel ca oricare alti
intregi. Exemplele de mai sus pot fi rescrise mai natural astfel
flags.is_extern = flags.is_static = 1;
pozitioneaza bitii pe unu;
flags.is_extern = flags.is_static = 0;
pozitioneaza bitii pe zero;
if (flags.is_extern == 0 && flags.is_static == 0) ...
pentru a-i testa.
Un cimp poate sa nu corespunda cu limitelke unui "int"; in
acest caz cimpul este alinial la urmatoarea margine 'int".
Cimpurile nu trebuie sa aibe un nume; cimpurile fara nume(doua
puncte si lungimea numai) sint folosite ca umplutura. Lungimea
speciala 0 poate fi folosita pentru alinierea la urmatoarea
"int" margine.
Exista un numar de reguli de aplicat cimpurilor. Dintre cele
mai importante, cipurile sint asignate de la stinga la dreapta in
unele masini si de la dreapta la stinga in altele ceea ce
reflecta natura diferita a hardwareului inseamna ca, desi cipurile
sint utilizabile de preferinta pentru a intretine structurile de
adte interne, chestiunea carui sfirsit vine primul trebuie
considerata cu grija pentru prelucrarea datelor definite extern.
Alte restrictii care trebuie avute in minte: cimpurile sint fara
semn ele pot fi memorate numai in "int"(sau echivalentul
"unsigned"); ele nu sint tablouri; ele nu au adrese, astfel ca
operatorul "&" nu le poate fi aplicat.