Hatékony memóriakezelő az azonos típusú elemek számára
Gyakran a nagy teljesítményt igénylő komplex programok létrehozásakor szükség van nem triviális megközelítésekre a különböző problémák megoldására, amelyek általában egyszerűen, de nem hatékonyan megoldódnak. Az ilyen feladatok egyike lehet az, hogy valós időben sok azonos méretű memória blokkot terjesszen elő. Az ilyen egységek stratégiai egységek, listaelemek és még sok más. A beépített memóriamenedzser kiváló feladat ez a feladat, de nem tudja ", hogy minden blokk azonos méretű, és nem mond semmit a számukról. Próbáljuk meg helyettesíteni a standard menedzsert saját, szakosodott, a fenti rendelkezések alapján, nevezetesen - a blokk méretének és a hozzávetőleges számának ismeretében.
Minden memóriakezelő két koncepciót használ: egy kiosztott (foglalt) blokkot és sok szabad blokkot. Az univerzális menedzserben minden szabad tömbnek saját mérete van, amely sok tényezőtől függ, függetlenül a menedzsernek, például a blokkok elosztásának / eltávolításának sorrendjéből és hasonlókból. De mindannyian egyszerű - a méretek azonosak és nincs szükség a megfelelő méretű blokk keresésére. Bemutatjuk a blokkok listájának fogalmát. A következő struktúrát alakítjuk ki:
A következő mutató négy bájtot foglal el, így a blokk által elfoglalt minimális méret négy lesz. Ez azonban nem akadályozza meg a kisebb méretű blokkok elosztását. Ezenkívül maga a struktúra magában foglalja az elemet, vagyis ugyanazt az objektumot, amelyhez memóriát osztunk ki. Ötvözi unió biztosítja számunkra a megfelelő elrendezése a következő területeken: ez a struktúra, nevezetesen - Fields következő elem és átfedik egymást, ami ebben az esetben egyfajta „trükk”, mert nem tudjuk használni egyikre nélkül cefrézés a másik. De ahogy később látható, minden egyes mezőt különböző időpontokban használnak, és nem zavarja egymást.
Mi mindent tárolunk, amit tovább írunk egy speciális osztályba, amely foglalkozik a memória elosztásával.
Azonban, hol tárolják a myMemBlock szerkezeti blokkokat? Vegyünk egy kis trükköt - tároljuk őket tömb formájában. Ehhez dinamikusan válasszon N elemek tömbjét, és ezt a szabad memória blokkok forrásaként használjuk fel. Nézzük meg a struktúrát az egyik ilyen tömbhöz.
Ebben a struktúrában van egy sor szabad elem, valamint egy mutató az alábbi struktúrára, mivel több N elemre lehet szükségünk.
A myManager osztály a következő formában jelenik meg.
Itt az ideje, hogy írjon az egyik legfontosabb funkció - blokk allokáció. Hogyan történik a kiválasztás? Először is, ellenőrizzük az ingyenes elemeket a FreeBlocks listában, és ha vannak ilyenek, csak adja ki a lista első elemét, és zárja ki. Szabad elemek hiányában az Array listának következő elemét osztjuk szét a myBigArray struktúrában, és elhelyezzük az Array [N] tömb összes újonnan létrehozott elemét a szabad blokkok listáján. Ezután megkapjuk az első esetet.
A normál memóriakezelő működéséhez szükséges következő funkciót később ismertetjük. Szükséges nem csak a blokkok elosztása, hanem azok felszabadítása is.
Amikor korábban elosztott blokkot bocsátunk ki, egyszerűen csak az ingyenes elemek listájára írjuk, és az elejére állítjuk. Érdekes dolog az, hogy "szabadítanánk" azt a blokkot, amelyet korábban nem adott el a menedzser! És legalább négy bájtos blokkok esetén megfelelően fog működni. Ez azonban nem helyes a jó programozási stílus szempontjából.
Tehát a myManager osztály következő revíziója.
Az ábra N = 6 esetén a tárgyak helyét mutatja, és a tömbök száma négy. A könnyű blokkokat szabad tömbökre osztják fel, míg a sötétek elfoglalják.
Minden könnyű (üres) blokk a FreeBlocks listán van, és a sötétek a kezelőnkkel együttműködő alkalmazás rendelkezésére állnak. A blokk felszabadításakor a FreeBlocks listába kerül, és később válik elérhetővé.
Itt ismét egy "trükkre" kellett menni - a szabadon belül a Free egy mutatót hagy a T típusú felszabadult blokknak, míg a blokkokat, mint a myMemBlock. Így van, hogy kifejezetten adni típusú, szem előtt tartva, hogy a T típusú valóban illik a myMemBlock, és felszámolták típusú myMemBlock azt, hogy végre ezt a „trükk”.
Az osztályban destruktor myManager eltávolítja az első elemet a tömb listán, és ezek mindegyike utódaik (lásd. MyBigArray osztály destructor) eltávolítjuk viszont. A menedzser általában növeli a tömbök számát, amíg egy bizonyos átlagos pozíció meg nem születik, attól függően, hogy milyen környezetben működik.
Ha az adott alkalmazás úgy, hogy a nagyszámú kiválasztás elemet és szakaszosan ritkán fordul elő, akkor lehetséges, hogy a funkció Free által használt blokkok száma az egyes tömb, és távolítsa el a teljes tömb bizonyos, hogy az nem tartalmaz elosztott egységek. Azonban nem sok értelme foglalkozni ilyen dolgokkal, mivel ez bonyolítja és lelassítja a munkát egy gyanakvással.
A menedzser sebessége és hatékonysága az adott alkalmazástól függ. Lehetőség van kiválasztani az N értékét a jó nagysebességű jellemzők biztosítása érdekében, miközben gazdaságos memóriafelhasználást tartanak fenn. Feleslegessé válik emlékezni arra, hogy a következő tömb létrehozásakor meglehetősen hosszú ciklusú új elemek felvétele a listára, ami időigényes. Meggyorsítják a munkát lehet elérni ismerve a pontos vagy hozzávetőleges blokkok száma, amelyek egyszerre lehetnek elosztva, és állítsa be a megfelelő értéket az állandó N. Amikor a „stand” eljárás költségei elosztásának új tag egyszerűen hiányos.
A menedzser használata a következőképpen ábrázolható. Hozzon létre globális objektumokat minden egyes szolgáltatásosztályhoz, és írja le a legegyszerűbb makrókat. Például: