Notez que RAII est un langage de programmation, tandis que la GC est une gestion de la mémoire technique. Nous sommes donc à comparer des pommes avec des oranges.
Mais nous pouvons restreindre l'RAII pour sa gestion de la mémoire aspects seulement et de les comparer à GC techniques.
La principale différence entre les dits RAII mémoire fondée sur les techniques de gestion (qui a vraiment les moyens de comptage de référence, au moins quand on considère les ressources de mémoire et d'ignorer les autres, tels que les fichiers) et une véritable collecte des ordures techniques de la manipulation de la circulaire références (pour les graphes cycliques).
Avec le comptage de référence, vous avez besoin de code spécialement pour eux (à l'aide de références faibles ou d'autres trucs).
Dans de nombreux cas ( std::vector<std::map<std::string,int>>
) le comptage de référence est implicite (puisqu'il ne peut être que 0 ou 1) et est pratiquement omis, mais le constructeur et le destructeur des fonctions essentielles à RAII) se comportent comme si il y avait une référence de comptage de bits (ce qui est pratiquement absent). En std::shared_ptr
il y a un véritable compteur de référence. Mais la mémoire est toujours implicitement gérés manuellement (avec new
et delete
déclenché à l'intérieur des constructeurs et destructeurs), mais que "implicite" delete
(dans les destructeurs) donne l'illusion de la gestion automatique de la mémoire. Toutefois, les appels à l' new
et delete
encore arriver (et ils coûtent du temps).
BTW le GC de la mise en œuvre peut (souvent) de la poignée de la circularité d'une certaine manière, mais vous laissez de la charge de la GC (par exemple, lire à propos de l' Cheney de l'algorithme).
Certains algorithmes de GC (notamment intergénérationnelle de la copie de garbage collector) ne vous embêtez pas à la libération de la mémoire pour les individuels, des objets, elle est sortie en masse après la copie. Dans la pratique, l'Ocaml GC (ou le SBCL un) peut être plus rapide qu'une véritable C++ RAII style de programmation (pour certains, pas tous, type d'algorithmes).
Certains GC fournir finalisation (principalement utilisé pour gérer les non-mémoire de ressources externes comme les fichiers), mais vous aurez rarement l'utiliser (comme la plupart des valeurs de consommer uniquement des ressources de la mémoire). L'inconvénient est que l'achèvement du programme n'offre pas les délais de garantie. Pratiquement parlant, un programme à l'aide de la finalisation est en l'utilisant comme un dernier recours (par exemple, la fermeture de fichiers doivent encore se produire plus ou moins explicitement à l'extérieur de finalisation, et aussi avec eux).
Vous pouvez avoir de fuites de mémoire de la cg (et aussi avec RAII, au moins lorsque mal utilisés), par exemple, lorsqu'une valeur est conservée dans une variable ou un champ, mais ne seront jamais utilisées à l'avenir. Ils se produisent moins souvent.
Je recommande la lecture de la collecte des ordures manuel.
Dans votre code C++, vous pouvez utiliser Boehm GC ou Ravenbrook des DÉPUTÉS ou votre propre code de traçage garbage collector. Bien sûr, à l'aide d'un GC est un compromis (il y en a certains inconvénients, par exemple, le non-déterminisme, le manque de synchronisation des garanties, etc...).
Je ne pense pas que RAII est la meilleure façon de traiter avec la mémoire dans tous les cas. À plusieurs reprises, le codage de votre programme dans un véritable et efficace GC implémentations (pensez à Ocaml ou SBCL) peut être plus simple (à développer) et plus rapide (pour exécution) que le codage avec fantaisie RAII style en C++17. Dans d'autres cas, il ne l'est pas. YMMV.
Par exemple, si l'on code un interpréteur Scheme en C++17 avec le plus chic RAII style, vous auriez encore besoin de code (ou d'utiliser) une explicite GC à l'intérieur (à cause d'un Régime de tas a circularités). Et la plupart des assistants de preuve sont codés en GC-ed langues, souvent fonctionnels, (le seul que je connaisse qui est codé en C++ est Maigre) pour de bonnes raisons.
BTW, je suis intéressé à trouver un tel C++17 de la mise en œuvre de Schéma (mais de moins en moins intéressé à coder moi-même), de préférence avec quelques multi-threading capacité.