Cominciamo postulando che la memoria è di gran lunga (decine, centinaia o addirittura migliaia di volte) più comune di tutte le altre risorse combinate. Ogni singola variabile, oggetto, membro oggetto necessita di memoria allocata e liberata in seguito. Per ogni file che apri, crei dozzine a milioni di oggetti per archiviare i dati estratti dal file. Ogni flusso TCP si accompagna a un numero illimitato di stringhe di byte temporanee create per essere scritte nel flusso. Siamo sulla stessa pagina qui? Grande.
Perché RAII funzioni (anche se hai puntatori intelligenti già pronti per ogni caso d'uso sotto il sole), devi avere la proprietà giusta. Devi analizzare chi dovrebbe possedere questo o quell'oggetto, chi non dovrebbe, e quando la proprietà dovrebbe essere trasferita da A a B. Certo, potresti usare la proprietà condivisa per tutto , ma poi emuleresti un GC tramite puntatori intelligenti. A quel punto diventa molto più facile e veloce costruire il GC nella lingua.
La garbage collection ti libera da questa preoccupazione per la risorsa di gran lunga più comunemente usata, la memoria. Certo, devi ancora prendere la stessa decisione per altre risorse, ma quelle sono molto meno comuni (vedi sopra) e anche la proprietà complicata (ad esempio condivisa) è meno comune. Il carico mentale è ridotto in modo significativo.
Ora, dai un nome ad alcuni aspetti negativi nel rendere tutti i valori raccolti. Tuttavia, l'integrazione di GC di sicurezza della memoria e tipi di valore con RAII in una lingua è estremamente difficile, quindi forse è meglio mimare questi compromessi con altri mezzi?
La perdita di determinismo si rivela in realtà non così grave in pratica, poiché influisce solo sulla durata deterministica dell'oggetto . Come descritto nel paragrafo successivo, la maggior parte delle risorse (a parte la memoria, che è abbondante e può essere riciclata piuttosto pigramente) non è destinata alla durata dell'oggetto in queste lingue. Ci sono alcuni altri casi d'uso, ma sono rari nella mia esperienza.
Il tuo secondo punto, la gestione manuale delle risorse, è oggi affrontato tramite un'istruzione che esegue la pulizia basata sull'ambito, ma non associa questa pulizia al tempo di vita dell'oggetto (quindi non interagisce con il GC e la sicurezza della memoria). Questo è using
in C #, with
in Python, try
-con-risorse nelle recenti versioni di Java.