C++ bez pointerov II.

Implementácia Garbage Collectora metódou Reference counting v sebe zahŕňa okrem iného udržiavanie počtu pointerov, ktoré ukazujú na jednotlivé časti dynamicky alokovanej pamäte. Problém je v tom, že C++ nemá mechanizmus, ktorý umožňuje dať vedieť jednému objektu, kedy iný objekt ukazuje na neho. Ale našťastie existuje riešenie: môžme vytvoriť nový typ pointera, ktorý podporuje Garbage Collection. To bude aj postup, ktorý bude použitý v tomto článku.

Na to, aby Garbage Collection podporoval tento nový typ pointeru, musí spĺňať nasledovné vlastnosti:

  • musí byť vedený zoznam odkazov aktívnych dynamicky alokovaných objektov
  • musí sledovať všetky operácie s pointermi, zvyšovať počet odkazov v zozname v určitom časovom okamihu vždy vtedy, ak pointer ukazuje na určitý objekt, a naopak znižovať počet odkazov v zozname, ak pointer ukazuje na iný objekt
  • musí recyklovať tie objekty, ktorých počet odkazov sa znížil na nulu, pričom okrem toho nový typ pointeru musí byť rovnaký ako normálny pointer, tzn. že všetky pôvodné pointerové operácie, ako * a -> sú podporované aj naďalej

Kedy spúšťať Garbage Collector

Z pohľadu procesov môže byť Garbage Collector vyvolávaný v tom istom vlákne ako proces, z ktorého sa spúšťa, alebo môže byť navrhnutý ako proces na pozadí, spúšťaný vo svojom vlastnom vlákne a vyvolávať Garbage Collector na pokyn procesora (CPU).

Výhodou stavby Garbage Collectora ako procesu na pozadí je efektívnosť. Vyvolá sa vždy vtedy, ak jednotlivé cykly CPU budú aktuálne voľné. Problém je ten, že C++ nepodporuje žiadnu zabudovanú podporu pre použitie viacerých vlákien. To znamená, že akékoľvek takéto multi vláknové mechanizmy sú závislé na operačnom systéme. Týmto sa stáva daný kód neprenositeľný.

Pri jedno-vláknovom použití sa kód stáva prenositeľný. Určitý nedostatok tohto prístupu je v tom, že program sa pri použití Garbage Collectora v čase manipulácie s pamäťou stáva neaktívny.

Jednoduchý Garbage Collector

V nasledujúcej časti bude uvedená celá implementácia Garbage Collectora. Ako už bolo spomenuté bude vytvorený nový typ pointeru, ktorý bude poskytovať vstavanú podporu Garbage Collectora (jedno-vláknový) založenú na metóde Reference counting. Nasledujúci kód by mal byť uložený v hlavičkovom súbore gc.h.

Základný popis Garbage Collectora

Vzhľadom na rozsiahlosť bude uvedený len popis najdôležitejších tried a ich prístupu k ostatným častiam Garbage Collectora.

Trieda GCPtr

Jadrom celého Garbage Collectora je táto trieda, ktorá implementuje pointer Garbage Collectora. V tejto triede uchovávame zoznam, ktorý asociuje odkazy s alokovanými časťami pamäte. Ako už bolo spomenuté, v každom časovom okamihu GCPtr ukazuje na časť pamäte, v ktorej má byť zvýšený počet odkazov. V prípade, že GCPtr ukazoval na inú časť pamäte než predtým, počet odkazov pre túto pamäť sa zníži.

GCPtr je šablóna, ktorá preťaží pointerové operátory * a ->, a tiež indexy operátora poľa []. Teda, GCPtr vytvorí nový typ pointeru a integruje ho do programovacieho prostredia jazyka C++. To umožňuje použiť GCPtr rovnakým spôsobom ako normálny C++ pointer.

Trieda GCInfo

Ako bolo uvedené, GCPtr odkazuje na zoznam alkovaných častí pamäte. Každá položka v tomto zozname je zapúzdrená v objekte typu GCInfo. GCInfo uchováva počet odkazov v položke refcount a pointer na túto pamäť v položke memPtr. Teda, objekt GCInfo pripája počet odkazov všetkých alokovaných častí pamäte.

Trieda Iter

Iter je šablóna podobná iterátoru z STL, ktorá v tomto prípade definuje všetky pointerové operácie, vrátane pointerovej aritmetiky. Základné použitie Iter je sprístupniť elementy v cykle pre dynamicky alokované pole. Iter získame z GCPtr volaním begin() a end(), ktorý funguje vo väčšine prípadov podobne ako v STL.

Výnimka OutOfRangeExc

Ak sa Iter stretne s pokusom v prístupe pamäte mimo rozsah alokovanej pamäte, bude vyvolaná výnimka OutOfRangeExc. Pre účely implementácie Garbage Collectora, OutOfRangeExc neobsahuje žiadne položky. Je to len jednoduchý typ, ktorý može byť vyvolaný. Avšak máte možnosť pridať relevantnú funkcionalitu tejto výnimke.

Použitá inšpirácia:
• The Art of C++ | Ch. Huang | McGraw-Hill | Boston 2005
• Naučte se C++ za 21 dní | J.Liberty | Computer Press | Brno 2007

You may also like...