Garbage Collection in pratica significa solo che gli oggetti allocati vengono rilasciati automaticamente quando non vengono più referenziati.
Più precisamente, vengono rilasciati quando diventano non raggiungibili per il programma, poiché gli oggetti di riferimento circolare non verranno mai rilasciati altrimenti.
Puntatori intelligenti fai semplicemente riferimento a qualsiasi struttura che si comporta come un normale puntatore, ma ha alcune funzionalità aggiuntive allegate. Questi includono , ma non si limitano alla deallocazione, ma anche a copy-on-write, controlli vincolati, ...
Ora, come hai detto, i puntatori intelligenti possono essere usati per implementare una forma di garbage collection.
Ma il filo del pensiero va nel modo seguente:
- La raccolta dei rifiuti è una cosa interessante, poiché è comoda e devo occuparmi di meno cose
- Pertanto: voglio la garbage collection nella mia lingua
- Ora, come posso ottenere GC nella mia lingua?
Naturalmente, è possibile progettarlo in questo modo dall'inizio. C # è stato progettato come garbage collection, quindi solo new
il tuo oggetto e verrà rilasciato quando i riferimenti non rientrano nell'ambito di applicazione. Il modo in cui ciò viene fatto dipende dal compilatore.
Ma in C ++ non era prevista la garbage collection. Se assegniamo un puntatore int* p = new int;
e non rientra nell'ambito, p
stesso viene rimosso dallo stack, ma nessuno si occupa della memoria allocata.
Ora l'unica cosa che hai dall'inizio sono i destructors deterministici . Quando un oggetto lascia l'ambito in cui è stato creato, viene chiamato il suo distruttore. In combinazione con i modelli e l'overloading dell'operatore, è possibile progettare un oggetto wrapper che si comporta come un puntatore, ma utilizza la funzionalità distruttore per ripulire le risorse ad esso collegate (RAII). Si chiama questo un puntatore intelligente .
Questo è tutto altamente specifico del linguaggio C ++: sovraccarico dell'operatore, modelli, distruttori, ... In questa particolare situazione linguistica, hai sviluppato dei puntatori intelligenti per fornirti il GC che desideri.
Ma se si progetta una lingua con GC dall'inizio, questo è semplicemente un dettaglio di implementazione. Dici solo che l'oggetto verrà ripulito e il compilatore lo farà per te.
I puntatori intelligenti come in C ++ probabilmente non sarebbero nemmeno possibili in linguaggi come C #, che non hanno alcuna distruzione deterministica (C # lavora intorno a questo fornendo zucchero sintattico per chiamare un .Dispose()
su determinati oggetti). Le risorse non referenziate alla fine saranno recuperate dal GC, ma non definite quando esattamente ciò accadrà.
E questo, a sua volta, può consentire al GC di svolgere il proprio lavoro in modo più efficiente. Essendo costruito nel più profondo del linguaggio rispetto ai puntatori intelligenti, che sono impostati su di esso, .NET GC può ad es. ritardare le operazioni di memoria ed eseguirle in blocchi per renderle più economiche o persino spostare la memoria in giro per aumentare l'efficienza in base alla frequenza di accesso degli oggetti.