resueltos - sintaxis de c++
Bibliotecas de recolección de basura en C++ (9)
Boost tiene una gran variedad de punteros inteligentes que implican el recuento de referencias o la eliminación de eliminación de alcance o el recuento de referencias intrusivas. Esto ha probado ser suficiente para nuestras necesidades. Una gran ventaja es que es todo gratis, código abierto, plantilla C ++. porque es un conteo de referencia, en la mayoría de los casos es altamente determinista cuando un objeto se destruye.
¿Qué bibliotecas de recolección de basura gratuitas y comerciales están disponibles para C ++, y cuáles son los pros y los contras de cada una?
Estoy interesado en las lecciones obtenidas con mucho esfuerzo del uso real en el campo, no en publicidad o propaganda promocional.
No es necesario detallar los intercambios habituales asociados con la recolección automática de basura, pero mencione los algoritmos utilizados (recuento de referencias, marca y barrido, incremental, etc.) y resuma brevemente las consecuencias.
El único que conozco es Boehm, que en la parte inferior es una marca y barrido tradicional. Probablemente use varias técnicas para optimizar esto, pero típicamente los GC incrementales / generacionales / de compactación serán difíciles de crear para C ++ sin recurrir a un subconjunto administrado como lo que se puede obtener con .Net C ++. Algunos de los enfoques que necesitan mover punteros pueden implementarse con soporte de compilador para fijar punteros o bloques de lectura / escritura, pero el efecto en el rendimiento puede ser demasiado grande y no es necesariamente cambios no triviales en el GC.
El recolector de basura Boehm está disponible de forma gratuita, y supuestamente bastante bueno (no es una experiencia de primera mano)
([ADVERTENCIA PDF] Documento teórico sobre la propuesta de C ++ 0x para el recolector de basura Boehm )
Originalmente se decía que hacía C ++ 0x , pero no lo hará después de todo (debido a las limitaciones de tiempo, supongo).
Proprosal N2670 (soporte mínimo para recolectores de basura) fue aprobado en junio de 2008, sin embargo, a medida que las implementaciones del compilador se dan cuenta de esto, y el estándar se finaliza, el mundo de la recolección de basura para C ++ seguramente cambiará ...
La principal dificultad con GC en C ++ es la necesidad de manejar módulos no cooperativos, en el sentido GC. es decir, para tratar con bibliotecas que nunca se escribieron con GC en mente.
Esta es la razón por la que a menudo se sugiere el GC Boehm.
Aquí hay un producto comercial que encontré solo buscando esta misma cosa
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 de si vendió el producto a alguien más.
Lee esto y echa un vistazo a las conclusiones:
Conclusiones
- Solución compleja al problema para el cual las soluciones simples son ampliamente utilizadas y serán mejoradas por C ++ 0x dejándonos poca necesidad.
- Tenemos poca o ninguna experiencia con las características de idioma recomendadas que deben estandarizarse.
- La reparación del mal sistema complejo de software nunca funcionará.
Se recomiendan cambios de lenguaje menores para mejorar el soporte futuro de GC: no permitir el ocultamiento de punteros (truco xor de la lista) como un ejemplo.
Finalmente: dirija el argumento "C ++ es malo porque no tiene GC" de frente. C ++ no genera basura, por lo que no necesita GC . Claramente Java, C #, Objective C, etc. generan mucha basura.
Sí, la última oración es subjetiva y también parte de las guerras santas.
Uso C ++ porque no me gusta la idea de que alguien necesite sacar la basura por mí.
El ayuntamiento lo hace y eso es suficiente para mí.
Si necesita GC use otro idioma. Elija la herramienta correcta para el trabajo correcto.
También puede usar Managed C ++ de Microsoft. El CLR y el GC son muy sólidos y se utilizan en productos de servidor, pero debe usar tipos de CLR para que el GC lo recopile realmente; 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 ++ te permite evolucionar tu base de códigos de una manera más progresiva.
Yo uso mucho boehm-gc. Es sencillo de usar, pero la documentación es realmente pobre. Hay una página de C ++, pero es bastante difícil de encontrar.
Básicamente, solo asegúrate de que cada clase hereda de su clase base y de que siempre pasas gc_allocator a un contenedor. En algunos casos, desea usar libgccpp para detectar otros usos de nuevo y eliminar. Estos son cambios en gran medida de alto nivel, y encontramos que podemos apagar el GC en tiempo de compilación usando un #ifdef, y que esto solo afecta a uno o dos archivos.
Mi mayor problema es que ya no puedes usar Valgrind, a menos que apagues el colector primero. Aunque apagar el colector es fácil de hacer y no requiere recompilarlo, obviamente es imposible usarlo si comienza a quedarse sin memoria.
He usado el coleccionista Boehm en el pasado con mucho éxito. Es de código abierto y se puede usar en software comercial.
Es un coleccionista conservador, y tiene una larga historia de desarrollo por uno de los principales investigadores en tecnología de recolección de basura.