50. cikk, ha van értelme, hogy cserélje ki az új és törölni - hatékony felhasználásának c

50. Amikor van értelme cserélni az új és törölni

Térjünk vissza az alapokhoz. Először is, hogy valaki miért kell cserélni a javasolt változata a fordító szereplő új és üzemeltető törli? Van legalább három leggyakoribb oka.

• A hatékonyság növelése érdekében. Változatban az új és törölhet, szállítja a fordító, univerzális. Alkalmasnak kell lenniük a hosszú futó programok (pl Web-szerverek), valamint a futó programok kevesebb, mint egy másodperc. Képesnek kell lenniük arra, hogy kezelni egy sor kérelmek elosztása nagy memória blokkok, kis blokk, valamint a kettő keverékét. Úgy kell alkalmazkodni a sokféle használati esetek - a dinamikus elosztás néhány nagy blokkokat, hogy létezik az egész program időtartama, elosztása és visszavételi memória nagyszámú kis tárgyak élettartama rövid. Úgy kell akadályozni töredezettség „kupac”, mert ha nem, akkor végül is lehetetlen lesz teljesíteni a kérést, hogy jelöljenek ki egy nagy blokk memória, akkor is, ha a teljes összeg ezt a rendelkezésre álló, de el egymástól több kis részből áll.

Tekintetbe véve a követelményeket a memória menedzser, nem meglepő, hogy a szállított fordítóprogramok szereplők új és törölni betartani átlagolt stratégia. Ezek elég jól működnek mindenkinek, de optimálisan - bárki számára. Ha Ön és a dinamikus memória használható a program, akkor képes lesz arra, hogy írjon a saját változatát az új és törölhet, kiváló teljesítmény szabvány. Az „felsőbbrendűségét”, azt jelenti, hogy az gyorsabb (néha több nagyságrenddel), és kevesebb memóriát (legfeljebb 50%). Néhány, de nem az összes, az alkalmazások helyett a mellékelt új és törölje a saját változatát - egy egyszerű módja a tárgyi teljesítmény javítására.

• A használati statisztikát. Mielőtt rátérnénk az írás saját új és törölhet, bölcsen, hogy információt gyűjtsön arról, hogy a program által használt dinamikus memóriát. Elosztott lefoglalt blokkok mérete? Elosztott életük? Az elosztásának eljárását és felszabadítja főleg következőképpen FIFO ( "first in - first out") vagy a LIFO ( "last in - first out")? Vagy bármely törvényt nem tartják be? hogy a természet a memória kihasználása idővel változik, azaz, hogy van-e különbség a sorrendben memória kiosztás, kiadás a különböző szakaszaiban végrehajtás? Mi az a maximális összeg dinamikusan allokált memóriát használja az adott pillanatban?

Lényegében írás egyéni változatai új és törlése - egy viszonylag egyszerű feladat. Például nézzük meg röviden, hogyan lehet végrehajtani a globális szereplő új kontroll bejegyzések nem a kiválasztott blokk. Azonban sok hibái, de még mindig nem figyelnek rájuk.

statikus const int aláírás = 0xDEADBEEF;

typedef unsigned char Byte;

// Ez a kód van néhány hiányossága - lásd alább.

void * operátor új (std: size_t méret) dobás (std :: bad_alloc)

using namespace std;

size_t realSize = mérete + 2 * sizeof (int); // méretének növelése a kért

// blokk, így helyet

void * pMem = malloc (realSize); // hívás malloc memória

// levelet az aláírás az első és az utolsó szó a kiválasztott blokk

* (Static_cast pMem)) = aláírás;

* (Reinterpret_cast (static_cast (pMem) + realSize-sizeof (int))) =

// visszatér egy mutatót a memória egyszerre a kezdeti aláírás

vissza static_cast (pMem) + sizeof (int);

A legtöbb hátrányait ez a verzió az új üzemeltető annak a ténynek köszönhető, hogy nem volt teljesen összhangban a vonatkozó megállapodások a C ++ függvények azonos nevet. Például az 51. kifejti, hogy minden üzemeltető tartalmaznia kell egy új ciklus hívás új felvezető, akkor ez a lehetőség nem. Ez a megállapodás hatálya alá tartozó 51., így most szeretnék összpontosítani finomabb pont: az összehangolás.

Alignment azért fontos, mert a C ++ megköveteli, hogy minden index által visszaadott az üzemeltető új, rendezi bármilyen típusú adatot. malloc függvény ugyanazok a követelmények, ezért használja a mutató által visszaadott malloc, biztonságosan. De fent az új üzemeltető, nem tér vissza a mutatót kapott malloc, és visszatér a mutató által visszaadott malloc tolódott int méretét. Nincs garancia arra, hogy ez biztonságos! Ha az ügyfél fogja hívni a new operátorral, hogy a memória, elég, hogy befogadja a kettős (vagy ha írunk az üzemeltető új [] memóriát egy sor kettős értékek), majd indítsa el a programot a gépen, ahol int 4 bájt és a kettős értékek kell igazítani nyolc bájtos határra blokkok valószínűleg vissza fog térni egy mutató helyesen kell beállítani. Ez okozhat vészleállító a program. Vagy csak lassítani a munkáját. Mindenesetre, ez nem az, amit akartunk.

A figyelmet az ilyen részletekre megkülönbözteti a professzionális minőségű memória vezetők az is, hogy gyorsan programozók kénytelenek megzavart egyéb feladatokat. Írja meg saját memória menedzser, amely majdnem működik egyszerűen elég. Írja az egyik, hogy jól működik, sokkal bonyolultabb. Általánosságban elmondható, hogy én nem ajánlom, hogy folytassa a helyzet, ha van égető szükség.

Sok esetben ez nem az. Néhány fordítóprogram kapcsoló, amely lehetővé teszi, hogy debug és log munka memória funkciókat. A felületes ismeretség a dokumentációt a fordító megszünteti annak szükségességét, hogy megírják saját változatának új és törölni. Számos platformon elérhető kereskedelmi termékek, amelyek lehetővé teszik, hogy cserélje ki a memóriát funkciókat, hogy jön a fordító. Ahhoz, hogy kihasználják a megnövekedett funkcionalitás és (feltehetően) javult a teljesítmény, csak újra kell rendezni a programot (és persze fizetni).

A téma ez a szabály - az a kérdés, ha van értelme, hogy cserélje ki a verzió új és törölje az alapértelmezett - globális szinten, illetve az osztály szintjén. Most megválaszolni ezt a kérdést részletesebben.

• A észlelni használati hibák (lásd fent).

• (lásd fent), hogy adatokat gyűjtsön a használata dinamikusan memóriát.

• Hogy gyorsítsa fel a memória kiosztás és engedje folyamat. általános célú allokátornak gyakran (de nem mindig) sokkal lassabb, mint az optimalizált verzió, különösen, ha az utóbbit tervezték tárgyak egy bizonyos típusát. Adott osztály forgalmazók példák elosztása rögzített méretű blokkok, mint azok, amelyek a könyvtár Pool projekt kiemelés. Ha az egyszálú alkalmazás, de a memória menedzser, hogy jött a fordító, az alapértelmezett thread-safe, akkor kap egy jelentős termelékenység növekedést írásban memória menedzser egyszálú alkalmazások. Természetesen, mielőtt úgy dönt, hogy meg kell átírni a new és delete operátorok, hogy javítsa a sebességet, győződjön meg arról, segítségével a profilalkotás, hogy ezek a funkciók valójában egy szűk keresztmetszetet.

• Annak érdekében, rezsiköltségek jellemző a normál memória menedzser. Menedzserek általános célú memória gyakran (de nem mindig) nem csak lassabb optimalizált változatokat, hanem fogyasztanak több memóriát. Ez annak a ténynek köszönhető, hogy minden egyes kijelölt blokk is némi fölött. Elosztók vannak optimalizálva kis tárgyak (például Pool), lehetővé teszik szinte megszabadulni ezeket a költségeket.

• Ahhoz, hogy kompenzálják az optimálisnál összehangolás az alapértelmezett forgalmazók. Mint már említettem, a leggyorsabb hozzáférést a kettős értékek x86 architektúrán érhető el, ha azok összhangban vannak a nyolc bájtos határra. Sajnos, az üzemeltetők új, amelyet egyes fordítóprogramok nem garantálják nyolc byte igazítás dinamikus elosztás dupla. Ezekben az esetekben, lecserélve az alapértelmezett új üzemeltető a különleges, ami garantálja az ilyen összehangolás adhat jelentős termelékenység növekedést a program.

• A csoport kapcsolódó objektumok együtt. Ha tudja, hogy bizonyos adatok struktúrák gyakran használják együtt, és azt szeretnék, hogy minimálisra csökkentse a hibaarány hiánya miatt oldalak fizikai memória, ha dolgozik az ilyen adatok, akkor van értelme, hogy hozzon létre egy külön halom ilyen szerkezetekre, hogy azok egybegyûltek, vagy néhány oldalt amennyire csak lehetséges. Változatok szereplők új és törli az elhelyezést (lásd. Általában 52) nyújthat ilyen egyesülés.

• Ahhoz, hogy a nem szabványos viselkedését. Néha szükség lehet a piaci szereplők új és törölje tenni valamit szállított a fordító verzió nem képes megtenni. Például, meg kell kiosztani és visszavételi memóriablokkokkal az osztott memóriát, de már csak egy programozási felület műveletek emlékét C. írása egy speciális változata az új és törlése (esetleg szállás -. Lásd szabály 52) lehetővé teszi, hogy lezárja a C API osztályok C ++. Azt is írni egy egyéni kezelő törli, amely kitölti nullákkal oldható memória javítására adatvédelem az alkalmazás.

Kapcsolódó cikkek