PDA

Visualizza la versione completa : [C++] Scrivere un garbage collector (ma perchè?)


MegaAlchimista
05-01-2013, 12:30
Salve a tutti, sto leggeno il libro The Art Of C++ (http://www.amazon.it/The-Art-C-Herbert-Schildt/dp/0072255129) , per chi non lo conoscesse è un libro che vuole essere di livello intermedio per chi già conosce i meccanismi del linguaggio e vuole approfondire vari aspetti.
Leggendo l'indice e la preefazione mi è sembrato molto utile e l'ho preso: sto cominciando a leggerlo proprio adesso, quando arrivato al primo capitolo mi ritrovo di fronte a "A Simple Garbage Collector for C++" . Nonostante tutti i suoi preamboli sui vantaggi di averne uno la mia domanda è comunque: ma perchè?
Chiedo ai programmatori più esperti: ma davvero vale la pena buttare così cicli di cpu solo per la paura di scordarsi qualche delete?
Non so mi sembra veramente un approccio migliore controllare che ad ogni new corrisponda una delete, piuttosto che andare ad implementare un sistema simile.
E se proprio si dovessero trattare oggetti in maniera complessa, puntati da parti diverse del programma (per esempio), non converrebbe usare degli smart pointer piuttosto?

MdE2005
05-01-2013, 12:44
Originariamente inviato da MegaAlchimista
Chiedo ai programmatori più esperti: ma davvero vale la pena buttare così cicli di cpu solo per la paura di scordarsi qualche delete?


Dipende sempre e solo dal contesto in cui si opera, così come vale o no la pena passare ore ed ore a cercare di risparmiare qualche istruzione Assembly per la programmazione di sistemi embedded o a basso livello.
In ogni caso, ecco un articolo (http://www.research.ibm.com/people/d/dgrove/papers/emsoft04.pdf) a proposito del GC per i sistemi embedded (in senso lato, riferito anche a dispositivi mobile)

MegaAlchimista
05-01-2013, 12:51
Ti ringrazio molto per la risposta ed andrò a leggere il link che mi hai dato, comunque ho avuto troppa fretta di chiedere :D
Nell'introduzione mi ha parlato un garbage collector, come un processo aggiuntivo che avveniva "alle spalle" dell'applicazione, parlndomi degli algoritmi mark and sweep e Copying.
Poi invece nell'implementazione sta andando a creare uno smart pointer con reference counting, del quale capisco in modo nitido l'utilità (e che in alcune occasioni ho già usato)

MItaly
05-01-2013, 16:39
Originariamente inviato da MegaAlchimista
Non so mi sembra veramente un approccio migliore controllare che ad ogni new corrisponda una delete, piuttosto che andare ad implementare un sistema simile.
Non è una cosa così banale... in primo luogo, a meno di non usare smart pointer e semantica RAII, è sostanzialmente impossibile garantire che ad ogni new corrisponda una delete, dato che, per via delle eccezioni, qualunque istruzione può essere un punto di uscita della funzione. Inoltre, se la semantica di ownership di un oggetto inizia ad essere "complicata" (ad esempio oggetti condivisi da più oggetti, o creati da una parte del programma e distrutti da un'altra, ...) tracciare il "ciclo di vita dell'oggetto" manualmente può essere complesso.


E se proprio si dovessero trattare oggetti in maniera complessa, puntati da parti diverse del programma (per esempio), non converrebbe usare degli smart pointer piuttosto?
È "l'altro approccio" rispetto alla garbage collection (anche se, se si hanno cicli di riferimenti, è necessario usare accortezze come i weak pointers).
Inoltre, smart pointer complessi (tipicamente gli shared_ptr) non sono neanche loro "gratuiti", specialmente in ambito multithreading.

Loading