it-swarm-es.com

Bibliotecas de recolección de basura en C ++

¿Qué bibliotecas de recolección de basura gratuitas y comerciales están disponibles para C++, y cuáles son las ventajas y desventajas de cada una?

Estoy interesado en lecciones duramente obtenidas del uso real en el campo, no en publicidad o publicidad promocional.

No es necesario profundizar en las compensaciones habituales asociadas con la recolección automática de basura, pero sí mencione los algoritmos utilizados (conteo de referencias, marca y barrido, incremental, etc.) y resuma brevemente las consecuencias.

65
Andrew Bettison

He usado Boehm collector en el pasado con buen éxito. Es de código abierto y se puede utilizar en software comercial.

Es un recolector conservador y tiene una larga historia de desarrollo por parte de uno de los principales investigadores en tecnología de recolección de basura.

27
Greg Hewgill

Boost tiene una gran variedad de punteros inteligentes que implican el recuento de referencias o la salida de eliminación en el alcance o el recuento de referencias intrusivas. Estos han demostrado lo suficiente para nuestras necesidades. Una gran ventaja es que todo es C++ gratuito, de código abierto y con plantilla. porque es un recuento de referencias, en la mayoría de los casos es altamente determinista cuando un objeto se destruye.

22
Tom Leys

Yo uso mucho boehm-gc. Es fácil de usar, pero la documentación es realmente pobre. Hay una página C++, pero es bastante difícil de encontrar.

Básicamente, solo se asegura de que cada clase herede de su clase base, y que siempre pase gc_allocator a un contenedor. En varios casos, desea usar libgccpp para capturar otros usos de new y delete. Estos son cambios en gran medida de alto nivel, y descubrimos que podemos apagar el GC en tiempo de compilación usando un #ifdef, y que admitir esto solo afecta a uno o dos archivos.

Mi principal problema es que ya no puede usar Valgrind, a menos que apague primero el recopilador. Si bien apagar el recopilador es fácil de hacer y no requiere recompilación, obviamente es imposible usarlo si comienza a quedarse sin memoria.

9
Paul Biggar

El recolector de basura Boehm está disponible gratuitamente, y supuestamente es bastante bueno (no tengo experiencia de primera mano)

([ADVERTENCIA PDF] Documento teórico sobre propuesta de C++ 0x para el recolector de basura Boehm )

Originalmente se dijo que hacía C++ 0x pero no lo hará después de todo (debido a limitaciones de tiempo, supongo).

Proprosal N267 (soporte mínimo para recolectores de basura) fue aprobado en junio de 2008, sin embargo, a medida que las implementaciones del compilador retoman esto, y el estándar se completa, el mundo de recolección de basura para C++ seguramente cambio...

9
Pieter

La mayor dificultad con los GC en C++ es la necesidad de manejar módulos no cooperativos, en el sentido de GC. es decir, para tratar con bibliotecas que nunca se escribieron teniendo en cuenta los GC.

Es por eso que a menudo se sugiere el Boehm GC.

2
Arafangion

El único que conozco es Boehm, que en la parte inferior es una marca y barrido tradicional. Probablemente utiliza varias técnicas para optimizar esto, pero generalmente será difícil crear GC incrementales/generacionales/de compactación para C++ sin recurrir a un subconjunto administrado como lo que puede obtener con .Net C++. Sin embargo, algunos de los enfoques que necesitan mover punteros pueden implementarse con el soporte del compilador para fijar punteros o bloques de lectura/escritura, pero el efecto en el rendimiento puede ser demasiado grande y no son necesariamente cambios no triviales en el GC.

2
larsivi

Aquí hay un producto comercial que encontré solo buscando lo mismo

HnxGC http://hnxgc.harnixworld.com/

En el pasado, también había un producto llamado Great Circle de Geodesic Systems, pero ya no parece que lo vendan. No tengo idea si vendió el producto a alguien más.

1
Daniel Holmes

También puede usar el C++ administrado de Microsoft. El CLR y el GC son muy sólidos y se utilizan en productos de servidor, pero debe usar los tipos de CLR para que el GC realmente recopile: no puede simplemente recompilar su código existente y eliminar todas las declaraciones de eliminación.

Prefiero usar C # para escribir código nuevo, pero Managed C++ le permite evolucionar su base de código de una manera más progresiva.

1
Remi Lemarchand

Lea esto y eche un buen vistazo a las conclusiones:

Conclusiones

  • Solución compleja al problema para el cual se usan ampliamente soluciones simples y serán mejoradas por C++ 0x dejándonos poca necesidad.
  • Tenemos poca o ninguna experiencia con las funciones de lenguaje recomendadas que deben estandarizarse.
  • Arreglar un sistema complejo de software defectuoso nunca funcionará.
  • Recomiende cambios de idioma menores para mejorar la compatibilidad futura con GC: no permita ocultar los punteros (xor list trick) como un ejemplo.

  • Finalmente, aborde el argumento "C++ es malo porque no tiene GC" de frente. C++ no genera basura y, por lo tanto, no necesita GC . Claramente, Java, C #, Objective C, etc. generan mucha basura.

Sí, la última oración es subjetiva y también una parte de las guerras santas.
Uso C++ porque no me gusta la idea de que alguien necesite sacar la basura por mí.
El ayuntamiento hace eso y eso es suficiente para mí.
Si necesita GC, use otro idioma. Elija la herramienta adecuada para el trabajo correcto.

1
the_drow