2013-11-15 6 views
5

Sto lavorando a un mio progetto di apprendimento (in C) e ho pensato di migrarlo in C++ per ottenere ulteriori punti di apprendimento. In parte si tratta di un sistema di garbage collection per una specifica famiglia di oggetti che, in C, normalmente implementerei con un grande malloc/mmap e andare con un semplice mark-and-sweep ingenuo (posso identificare riferimenti e cose del genere già).Raccolta garbage giocattolo: l'operatore è nuovo/cancella abbastanza?

Il mio problema è che stavo considerando di trasportare quell'idea in C++ ma non mi sento abbastanza sicuro sulla mia comprensione del suo schema di gestione della memoria.

Finora ho considerato l'allocazione di un grande pool di memoria e di operatori di overload nuovi ed eliminati su una classe base per chiamare le funzioni Grab/Release del mio pool di memoria, quindi lasciare che la fase di spazzatura del garbage collector elimini gli oggetti mentre li vedeva . È abbastanza? Quali sono le insidie ​​nascoste che non riesco a vedere qui?

Modifica: per chiarire, sono in grado di capire già la durata di vita degli oggetti allocati, quindi non è necessario utilizzare il gc abi. Gli oggetti saranno raramente manipolati dal codice C++ e il codice che li usa è in grado di informare i gc che vengono utilizzati senza necessità di ispezionare lo stack.

+0

Si potrebbe voler leggere i commenti di Bjarne Stroustrup su questo come punto di partenza: http://www.stroustrup.com/C++11FAQ.html#gc-abi Ha anche collegamenti alle pagine di Hans Boehm, quindi penso è un ottimo punto di partenza. –

risposta

1

Se si stanno modificando le classi, perché non le ereditano da una nuova classe base che si registra in un GC durante la costruzione e le unregisters durante la distruzione. La classe manager farà la contabilità. La classe base può essere un modello:

template <class parent> class BASE_GC { 
    BASE_GC() { /* register address and name*/} 
    ~BASE_GC() { /* unregister*/} 
}; 

Il nome della classe genitore può essere derivato da typeid (* questo) .name(). Come il nome della classe base include il nome genitore.

+0

Questo potrebbe fare tutto ciò di cui ho bisogno, anzi. Se invece di limitarmi a fare la contabilità di GC, decido di utilizzare un allocatore diverso per giocare con diverse strategie di allocazione, ci sarebbe qualche conflitto con l'operatore semplicemente sovrascrivente nuovo e cancellato? Quindi, se finisco per scavalcare l'operatore nuovo e cancella, ha senso tenere la contabilità di GC su costruttore/distruttore invece che sugli operatori di memoria? –

Problemi correlati