Manager eficient de memorie pentru același tip de elemente


Adesea, atunci când se creează programe complexe care necesită performanțe ridicate, este nevoie de abordări non-trivială pentru rezolvarea diferitelor probleme, care de obicei sunt rezolvate destul de simplu, dar ineficient. Una dintre aceste sarcini poate fi necesitatea de a distribui în timp real o mulțime de blocuri de memorie de aceeași dimensiune. Astfel de unități pot fi unități în strategie, elemente de listă și multe altele. Managerul de memorie încorporat face o treabă excelentă, însă nu știe că toate blocurile noastre au aceleași dimensiuni și nu sugerează nimic despre numărul lor. Să încercăm să înlocuim managerul standard cu propriul nostru, specializat, construit pe baza prevederilor de mai sus, și anume - în cunoașterea dimensiunii blocului și a numărului aproximativ al acestuia.







Fiecare manager de memorie funcționează cu două concepte - un set de blocuri alocate (ocupate) și o mulțime de blocuri libere. În managerul universal, fiecare bloc liber are dimensiunea proprie, care depinde de mulți factori independenți de manager, cum ar fi ordinea de alocare / eliminare a blocurilor și altele asemenea. Dar la noi totul este simplu - dimensiunile sunt identice și nu este necesară în căutarea blocului cu dimensiunea necesară. Introducem conceptul unei liste de blocuri. Vom stabili următoarea structură:

Următorul pointer ocupă acum patru octeți, astfel încât dimensiunea minimă ocupată de bloc va fi de patru. Cu toate acestea, acest lucru nu ne împiedică să alocăm blocuri de dimensiuni mai mici. În plus, structura însăși conține elementul însuși, adică același obiect în care alocăm memoria. Combinând uniunea ne oferă aranjamentul corect al domeniile acestei structuri, și anume, - Domenii Element următor și se suprapun, care este în acest caz un fel de „truc“, după cum nu putem folosi una dintre aceste domenii, fără zdrobire cealaltă. Dar, după cum se va vedea mai târziu, fiecare dintre câmpuri este folosit în momente diferite și nu interferează unul cu altul.

Vom păstra tot ceea ce scriem mai departe într-o clasă specială, care se va ocupa de alocarea memoriei.

Cu toate acestea, unde vor fi stocate blocurile de structură myMemBlock? Să aplicăm un mic truc - îl vom păstra sub forma unui matrice. Pentru aceasta, selectați în mod dinamic o matrice de elemente N și o vom folosi ca o resursă a blocurilor de memorie libere. Să obținem structura pentru una din aceste matrice.

În această structură, avem un set de elemente libere, precum și un pointer la următoarea structură, deoarece putem cere să distribuim mai mult de elemente N.







Clasa myManager are următoarea formă.

Este timpul să scrieți una dintre cele mai importante funcții - alocarea blocurilor. Cum va avea loc selecția? În primul rând, verificăm pentru elementele gratuite din lista FreeBlocks și dacă există, emiteți primul element al listei și excludeți-l. În absența elementelor libere, distribuim următorul element din lista Arrays sub forma structurii myBigArray și plasăm toate elementele nou create ale matricei Array [N] în lista de blocuri libere. Apoi vom obține situația inițială pentru primul caz.

Următoarea funcție necesară pentru ca managerul de memorie să funcționeze va fi descris mai târziu. Este necesar nu numai să alocăm blocuri, ci și să le eliberăm.

Când eliberăm un bloc alocat anterior, îl scriem pur și simplu pe lista elementelor libere, plasându-l la început. O caracteristică interesantă este că putem "elibera" blocul care nu a fost distribuit anterior de managerul nostru! Și va funcționa corect pentru blocuri de cel puțin patru octeți. Cu toate acestea, acest lucru nu este corect din punctul de vedere al stilului bun de programare.

Deci, următoarea revizuire a clasei myManager.

Figura arată locația obiectelor în cazul lui N = 6, iar numărul de tablouri este de patru. Blocurile de lumină sunt alocate blocurilor libere, în timp ce cele întunecate sunt ocupate.

Toate lumina (care nu sunt ocupate) blocuri sunt în lista FreeBlocks, și întuneric la dispoziția unei aplicații care funcționează cu managerul nostru. Odată cu lansarea blocului, acesta este plasat în lista FreeBlocks și devine disponibil pentru alocare suplimentară.

Aici a trebuit să mergem din nou la un "truc" - în interiorul funcției Free este trecut un pointer la blocul eliberat de tip T, în timp ce avem blocuri precum myMemBlock. Deci, va trebui să dea în mod explicit tipuri, ținând cont de faptul că tipul de T se potrivesc de fapt, în myMemBlock, iar noi lichidată de tip myMemBlock să pună în aplicare acest „truc“.

În destructor clasa myManager elimină primul element din lista de matrice, și ei sunt fiecare dintre urmașii lor (a se vedea. MyBigArray clasa destructor) este eliminat la rândul său. Managerul nostru va crește, în general, numărul de tablouri până la stabilirea unei anumite poziții medii, în funcție de caracteristicile mediului în care va funcționa.

Dacă aplicația particulară astfel încât un număr mare de elemente de selecție și discontinuă apare rar, este posibil de a face funcția Free de numărul de blocuri folosite în fiecare matrice și elimina întreaga matrice, la sigur că nu conține unități distribuite. Cu toate acestea, nu are sens de a face cu astfel de lucruri, deoarece acest lucru va complica și încetini munca cu o victorie îndoielnică.

Viteza și eficiența managerului depind de aplicația specifică. Este posibilă selectarea valorii lui N pentru a asigura caracteristici bune de mare viteză, păstrând în același timp un consum economic de memorie. Va fi inutil să ne amintim că atunci când se creează matricea următoare, are loc un ciclu destul de lung de adăugare de elemente noi în listă, ceea ce necesită consumatoare de timp. Accelerarea activităților poate fi realizată prin cunoașterea numărul exact sau aproximativ de blocuri, care pot fi distribuite și a stabilit valoarea corespunzătoare a N. constantă Atunci când „stau“ costurile procesului de alocare a unui nou membru va pur și simplu sărăcăcioasă simultan.

Utilizarea managerului poate fi reprezentată după cum urmează. Creați obiecte globale pentru fiecare dintre clasele de caracteristici și scrieți cele mai simple macrocomenzi. De exemplu:







Articole similare

Trimiteți-le prietenilor: