it-swarm-pt.tech

Bibliotecas de coleta de lixo em C ++

Quais bibliotecas de coleta de lixo gratuitas e comerciais estão disponíveis para C++ e quais são os prós e os contras de cada uma?

Estou interessado em lições conquistadas com muito esforço pelo uso real no campo, não por publicidade ou publicidade.

Não há necessidade de elaborar as trocas usuais associadas à coleta automática de lixo, mas mencione os algoritmos usados ​​(contagem de referência, marcação e varredura, incremental etc.) e resuma brevemente as conseqüências.

65
Andrew Bettison

Eu usei o coletor Boehm no passado com bom sucesso. É de código aberto e pode ser usado em software comercial.

É um colecionador conservador e tem uma longa história de desenvolvimento por um dos principais pesquisadores em tecnologia de coleta de lixo.

27
Greg Hewgill

O Boost possui uma grande variedade de ponteiros inteligentes que implementam a contagem de referência ou a saída com exclusão no escopo ou contagem intrusiva de referência. Estes provaram o suficiente para as nossas necessidades. Uma grande vantagem é que tudo é C++ gratuito e de código aberto. porque é contagem de referência, na maioria dos casos é altamente determinístico quando um objeto é destruído.

22
Tom Leys

Eu uso muito o boehm-gc. É simples de usar, mas a documentação é realmente ruim. Existe uma página C++, mas é bastante difícil de encontrar.

Basicamente, você apenas garante que todas as classes sejam herdadas da classe base e que sempre passa gc_allocator para um contêiner. Em vários casos, você deseja usar o libgccpp para capturar outros usos de new e delete. Essas são alterações de alto nível e descobrimos que podemos desligar o GC em tempo de compilação usando um #ifdef, e que o suporte a isso afeta apenas um ou dois arquivos.

Meu maior problema é que você não pode mais usar o Valgrind, a menos que desligue o coletor primeiro. Embora desligar o coletor seja fácil e não exija a recompilação, é obviamente impossível usá-lo se você começar a ficar sem memória.

9
Paul Biggar

O coletor de lixo Boehm está disponível gratuitamente e supostamente é bom (sem experiência em primeira mão)

([PDF WARNING] Artigo teórico sobre proposta C++ 0x para o coletor de lixo Boehm )

Dizia-se originalmente que ele fazia C++ 0x , mas não o fará depois de tudo (devido a restrições de tempo, suponho).

Proprosal N267 (suporte mínimo para coletores de lixo) foi aprovado em junho de 2008, portanto, como as implementações do compilador percebem isso e o padrão é finalizado, o mundo da coleta de lixo disponível para C++ certamente mudança...

9
Pieter

A principal dificuldade com GCs em C++ é a necessidade de lidar com módulos não cooperativos, no sentido de GC. ou seja, para lidar com bibliotecas que nunca foram escritas com GC em mente.

É por isso que o Boehm GC é frequentemente sugerido.

2
Arafangion

O único que eu conheço é Boehm, que na parte inferior é uma marca e varredura tradicional. Provavelmente, ele usa várias técnicas para otimizar isso, mas normalmente é difícil criar GCs incrementais/geracionais/compactadores para C++, sem a necessidade de um subconjunto gerenciado, como o que você pode obter com o .Net C++. Algumas das abordagens que precisam mover ponteiros podem ser implementadas com o suporte do compilador para fixar ponteiros ou blocos de leitura/gravação, mas o efeito no desempenho pode ser muito grande e não são necessariamente alterações não triviais no GC.

2
larsivi

Aqui está um produto comercial que encontrei ao procurar a mesma coisa

HnxGC http://hnxgc.harnixworld.com/

Naquela época, havia também um produto chamado Great Circle da Geodesic Systems, mas parece que eles não vendem mais. Não faço ideia se o produto foi vendido a mais alguém.

1
Daniel Holmes

Você também pode usar o C++ gerenciado da Microsoft. O CLR e o GC são muito sólidos e usados ​​em produtos de servidor, mas você precisa usar os tipos de CLR para o GC realmente coletar - você não pode apenas recompilar seu código existente e remover todas as instruções de exclusão.

Prefiro usar o C # para escrever um código totalmente novo, mas o C++ gerenciado permite que você evolua sua base de código de maneira mais progressiva.

1
Remi Lemarchand

Leia this e dê uma boa olhada nas conclusões:

Conclusões

  • Solução complexa para o problema para o qual as soluções simples são amplamente usadas e serão aprimoradas pelo C++ 0x, deixando-nos pouca necessidade.
  • Temos pouca ou nenhuma experiência com os recursos de idioma recomendados que devem ser padronizados.
  • Corrigir um sistema complexo de software ruim nunca funcionará.
  • Recomende pequenas alterações de idioma para melhorar o suporte futuro do GC - não permita ocultar ponteiros (truque da lista xor) como um exemplo.

  • Finalmente - endereça o argumento "C++ é ruim porque não possui GC" de frente. O C++ não gera lixo e, portanto, não precisa de GC . Claramente Java, C #, Objective C, etc. geram muito lixo.

Sim, a última frase é subjetiva e também faz parte das guerras sagradas.
Uso C++ porque não gosto da idéia de que alguém precise tirar o lixo para mim.
A prefeitura faz isso e isso é o suficiente para mim.
Se você precisar de GC, use outro idioma. Escolha a ferramenta certa para o trabalho certo.

1
the_drow