logo

Zber odpadu v C

V počítačových jazykoch zber odpadu je kľúčovou súčasťou správy pamäte. Je to postup automatickej identifikácie a uvoľnenia pamäte programu. Programovaniu v C chýbajú vstavané funkcie garbage collection, pretože ide o a nízky level programovací jazyk. Existuje však množstvo knižníc, ktoré ponúkajú funkcie garbage collection pre C programy. V tomto článku preskúmame zber odpadu v C a ako sa implementuje pomocou, Boehm-Demers-Weiser zberač odpadu knižnica.

C ponúka nízkoúrovňové mechanizmy správy pamäte prostredníctvom svojho malloc() a funkcie free(). . The metóda free(). sa používa na uvoľnenie pamäte, keď už nie je potrebná, zatiaľ čo funkcia malloc(). sa používa na dynamické prideľovanie pamäte počas behu. Základná syntax týchto funkcií je nasledovná:

 void* malloc(size_t size); void free(void* ptr); 

Ukazovateľ na začiatok pridelenej pamäte vráti malloc() funkciu výmenou za argument špecifikujúci počet bajtov, ktoré sa majú prideliť. Pamäť, ktorá bola predtým pridelená metóda malloc(). je prepustený tým funkcia free(). , čím sa sprístupní pre dodatočné pridelenia.

Zatiaľ čo systém správy pamäte C umožňuje veľkú flexibilitu, zaťažuje aj správu pamäte programátora. Úniky pamäte môžu byť výsledkom nesprávneho použitia rutín správy pamäte, keď je pamäť alokovaná, ale nikdy nie je uvoľnená, alebo chyby segmentácie, kedy sa k pamäti pristupuje po jej uvoľnení.

Technika správy pamäte tzv zber odpadu automaticky identifikuje a uvoľní pamäť, ktorú už program nepoužíva. Odvoz odpadu programátor nemusí spravovať pamäť manuálne, čo znižuje riziko úniku pamäte a chýb segmentácie.

Pre program C, Boehm-Demers-Weiser ponúka knižnica garbage collector zbieranie odpadu schopnosti. Pamäť je možné alokovať pomocou zbierky funkcií knižnice, ktoré možno použiť aj na automatickú identifikáciu a uvoľnenie pamäte, ktorá sa už nepoužíva. Knižnica zamestnáva a mark-and-sweep technika na nájdenie a uvoľnenie pamäte.

Syntax:

Základná syntax Boehm-Demers-Weiser Funkcie knižnice garbage collector sú nasledovné:

 #include void* GC_malloc(size_t size); void* GC_calloc(size_tnmemb, size_t size); void* GC_realloc(void* ptr, size_t size); void GC_free(void* ptr); 

V tejto syntaxi je Funkcia GC_calloc(). sa používa na pridelenie pamäte a jej inicializáciu nula , keďže Funkcia GC_malloc(). dynamicky alokuje pamäť. Podobné ako metóda realloc(). v C, GC_realloc() funkcia sa používa na opätovné priradenie pamäte. Uvoľnenie pamäte sa vykonáva pomocou metóda GC_free(). .

Pozrime sa na ilustráciu Boehm-Demers-Weiser Knižnica zberača odpadu v akcii. Nasledujúci program používa Funkcia GC_malloc(). na pridelenie pamäte pre každý uzol pri vytváraní prepojeného zoznamu celých čísel. Potom sa vytlačia hodnoty prepojeného zoznamu a program sa potom ukončí.

 #include #include typedef struct node { int value; struct node* next; } node; int main() { GC_INIT(); node* head = GC_malloc(sizeof(node)); node* current = head; for (int i = 1; ivalue = i; current->next = GC_malloc(sizeof(node)); current = current->next; } current->next = NULL; current = head; while (current != NULL) { printf('%d
', current->value); current = current->next; } return 0; } 

Výkon:

Pri spustení programu sa vytvorí nasledujúci výstup:

 1 2 3 4 5 6 7 8 9 10 

Vysvetlenie:

V tomto príklade najprv použijeme GC_INIT() funkcia na inicializáciu zberača odpadu. Potom sa vytvorí hlavný uzol prepojeného zoznamu pomocou metóda GC_malloc(). a aktuálny ukazovateľ sa zmení tak, aby ukazoval naň. Ďalším krokom je použitie slučky na pridanie ďalších uzlov do prepojeného zoznamu, pričom hodnotu každého uzla priradíte počítadlu slučky variabilný i a jeho ďalší ukazovateľ na uzol za ním v zozname. Aby sme signalizovali koniec zoznamu, nakoniec nastavíme ďalší ukazovateľ posledného uzla v zozname na NULOVÝ .

Pomocou a pričom slučka prejsť zoznamom a vytlačiť hodnotu každého uzla a potom vytlačíme hodnoty v prepojenom zozname. Nakoniec my vrátiť 0 ukázať, že program úspešne bežal.

Záver

V tomto blogovom článku sme sa pozreli na Boehm-Demers-Weiser Implementácia garbage collector library s garbage collectorom v jazyku C. Preskúmali sme základnú syntax funkcií knižnice garbage collector a ukázali sme, ako ich použiť v priamom príklade programu. Hovorili sme aj o výstupe vzorového programu a jeho dôležitosti.

celkovo zber odpadu je zásadný prístup, ktorý môže pomôcť programátorom C pri lepšej a efektívnejšej správe pamäte. Programátori v jazyku C môžu profitovať zo zberu odpadu pri používaní nízkoúrovňového jazyka pomocou Boehm-Demers-Weiser balík na zberač odpadu.