web-dev-qa-db-fra.com

Bibliothèques de collecte des ordures en C ++

Quelles bibliothèques de collecte de déchets libres et commerciales sont disponibles pour C++ et quelles sont les avantages et les inconvénients de chacun?

Je suis intéressé par des leçons durement gagnées d'une utilisation réelle sur le terrain, pas de marketing ou de texte promotionnel.

Il n'est pas nécessaire d'élaborer des offices commerciaux habituels associés à la collecte automatique des ordures, mais veuillez mentionner les algorithmes utilisés (comptage de référence, marquage et balayage, incrémental, etc.) et résument brièvement les conséquences.

65
Andrew Bettison

J'ai utilisé le Collector Boehm dans le passé avec un bon succès. C'est open source et peut être utilisé dans des logiciels commerciaux.

C'est un collectionneur conservateur et a une longue histoire de développement par l'un des chercheurs principaux de la technologie de collecte des ordures.

27
Greg Hewgill

Boost a une grande gamme de Smart Pointers Quel implémentation de référence de référence ou de la sortie de la sortie ou de la référence intrusive. Ceux-ci se sont avérés suffisamment pour nos besoins. Un plus grand avantage est que tout est libre, open source, modélisé C++. Parce que c'est le comptage de référence, dans la plupart des cas, il est très déterministe lorsqu'un objet est détruit.

22
Tom Leys

J'utilise beaucoup Boehm-GC. Il est simple à utiliser, mais la documentation est vraiment mauvaise. Il y a une page C++, mais c'est assez difficile à trouver.

Fondamentalement, vous vous assurez simplement que chaque classe hérite de leur classe de base et que vous passez toujours gc_allocator à un conteneur. Dans un certain nombre de cas, vous souhaitez utiliser LibgccPP pour attraper d'autres utilisations de nouvelles et supprimées. Ce sont des changements en grande partie de haut niveau, et nous constatons que nous pouvons éteindre le GC au moment de la compilation à l'aide d'un #Ifdef, et que la prise en charge de cela n'affecte qu'un ou deux fichiers.

Mon problème majeur avec c'est que vous ne pouvez plus utiliser Valgrind, à moins que vous n'allumiez d'abord le collecteur. Tout en tournant le collecteur éteint est facile à faire et ne nécessite pas de recompilation, il est évidemment impossible de l'utiliser si vous commencez à manquer de mémoire.

9
Paul Biggar

Le collecteur de poubelles Boehm est disponible librement et supposément plutôt bon (pas d'expérience de première main moi-même)

([Avertissement PDF] Papier théorique sur Proposition C++ 0x pour le collecteur des ordures Boehm )

Il a été dit à l'origine de faire C++ 0x , mais ne le rendra pas après tout (en raison de contraintes de temps, je suppose).

Proprosal N267 (support minimal des capteurs de déchets) a été approuvé en juin 2008, de sorte que les implémentations de compilateur prennent une prise en charge et que la norme est finalisée, le World de la collection de déchets pour C++ est sûr de monnaie...

9
Pieter

La difficulté majeure avec GC en C++ est la nécessité de gérer des modules non coopératifs, au sens du GC. c'est-à-dire pour traiter des bibliothèques qui n'ont jamais été écrits avec GC.

C'est pourquoi le Boehm GC est souvent suggéré.

2
Arafangion

Le seul que je connaisse est Boehm, qui au fond est une marque traditionnelle et un balayage. Il utilise probablement diverses techniques pour optimiser cela, mais typiquement progressivement/générationnel/compactant GC sera difficile à créer pour C++ sans aller pour un sous-ensemble géré tel que ce que vous pouvez obtenir avec .NET C++. Certaines des approches à déplacer peuvent être mises en œuvre avec la prise en charge du compilateur pour les pointeurs d'épingle ou les blocs de lecture/écriture, mais l'effet sur la performance peut être trop important et ce n'est pas nécessairement des modifications non triviales à la GC.

2
larsivi

Voici un produit commercial que j'ai trouvé en juste à la recherche de cette même chose

HNXGC http://hnxgc.harnixworld.com/

De retour dans la journée, il y avait aussi un produit appelé grand cercle de systèmes géodésiques, mais n'a pas l'air de vendre cela plus. Aucune idée de la vente du produit à quelqu'un d'autre.

1
Daniel Holmes

Vous pouvez également utiliser le C++ géré de Microsoft. Le CLR et le GC sont très solides et utilisés dans les produits du serveur, mais vous devez utiliser des types de CLR pour le GC pour collecter - vous ne pouvez pas simplement recompiler votre code existant et supprimer toutes les instructions de suppression.

Je préférerais utiliser C # pour écrire un nouveau code, mais géré C++ vous permet d'évoluer votre base de code de manière plus progressive.

1
Remi Lemarchand

Lire - this et regardez bien les conclusions:

Conclusions

  • Solution complexe au problème pour lequel des solutions simples sont largement utilisées et seront améliorées par C++ 0x nous laissant peu de besoin.
  • Nous n'avons peu aucune expérience avec les caractéristiques de langue recommandées qui doivent être normalisées.
  • La fixation du système de complexité logiciel de mauvaise qualité ne fonctionnera jamais.
  • Recommander des modifications linguistiques mineures visant à améliorer le futur soutien de GC - interdire la cachette des pointeurs (astuce de liste XOR) comme exemple.

  • Enfin - Adresse "C++ est mauvais car il n'a pas d'argument de GC". C++ ne générait pas de déchets et n'a donc pas besoin de GC . Clairement Java, C #, Objectif C, etc. Générez beaucoup de poubelles.

Oui, la dernière phrase est subjective et une partie des guerres saintes.
[.____] J'utilise C++ parce que je n'aime pas l'idée que quelqu'un a besoin de sortir de la poubelle pour moi.
[.____] L'hôtel de ville fait ça et ça me suffit.
[.____] Si vous avez besoin de GC, utilisez une autre langue. Choisissez le bon outil pour le bon travail.

1
the_drow