• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Jeronimus Linuxius

Garbage Collector conservativo para C/C++

5 mensagens neste tópico

Encontrei uma coisa interessante para quem se sente frustrado a fazer free() tantas vezes.

http://www.hpl.hp.com/personal/Hans_Boehm/gc/

Se percebi bem, é um atribuidor de memória que sonda o stack e os dados estáticos à procura de ponteiros, e liberta os blocos de memória que não aparecerem referenciados em lado nenhum.

Teve sucesso mesmo em programas bastante exóticos, incluindo na biblioteca do X11.

Reparem que estamos a falar de uma linguagem de programação que torna a vida difícil a qualquer garbage collector.

JJ

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Penso que o Mono usava essa implementação como GC.

Mas nunca usei em programas meus. :P

Quando quero fazer algo mais complexo que justifique o uso de um GC, então uso outra linguagem como C# ou Java, que já têm um GC integrado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ja' tinha lido sobre ele, mas sou cético. O GC vai ter que percorrer todo o address space do programa, isso e' muito mais lento do que e' feito por um GC de uma linguagem com noção forte de referencias (visto que so' verifica as referencias em si). Alem disso a' outro problema, se houver "hacks" de apontadores o GC não vai encontrar essas referencias e vai libertar a memoria (ex: XOR linked list).

Ainda a' outro problema que me atormenta, se eu tiver alocado memoria, imagimos em 0xbabeface. Se por acaso eu tiver um inteiro (ou uma qq posição de memoria) com esse valor, por coincidencia, ele vai encontrar esse suposta referencia e pensa que a memoria em 0xbabeface esta' a ser usada e portanto nunca a liberta.

C e' manhoso para este tipo de coisas. Pessoalmente perfiro ter uma boa disciplina de mallocs/frees.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ja' tinha lido sobre ele, mas sou cético. O GC vai ter que percorrer todo o address space do programa, isso e' muito mais lento do que e' feito por um GC de uma linguagem com noção forte de referencias

Não todo o address space, mas sim as partes de AS que possam ter eventualmente ponteiros, tais com, o stack (até ao stack pointer actual) e a secção .data.

Alem disso a' outro problema, se houver "hacks" de apontadores o GC não vai encontrar essas referencias e vai libertar a memoria (ex: XOR linked list).

Essa dói um bocado.

E esses hacks de apontadores não são recomendados (são mesmo hacks, e por sinal bastante feios), e tipicamente só os vais querer usar em sistemas com pouca memória (pelo menos é o que se aplica às XOR doubly-linked lists), e nesses sistemas normalmente não vais querer usar GC de qualquer forma.

Ainda a' outro problema que me atormenta, se eu tiver alocado memoria, imagimos em 0xbabeface. Se por acaso eu tiver um inteiro (ou uma qq posição de memoria) com esse valor, por coincidencia, ele vai encontrar esse suposta referencia e pensa que a memoria em 0xbabeface esta' a ser usada e portanto nunca a liberta.

Isso é um caso muito raro mesmo. Tipicamente, os leaks provocados por isso vão ser irrisórios.

A única hipótese mais grave que estou a ver é ser um bloco bastante grande (porque é mais fácil um valor acertar "em cheio", e também porque se perde mais memória nesses casos).

Se calhar, nesses casos o melhor que tens a fazer é fazer GCfree() manualmente para os blocos maiores e deixar o GC tratar dos outros.

PS: É claro que a programação em C perde todo o seu requinte com isto. xD Sim, concordo que quem quer ter as vantagens de um GC não deve usar C. Mas mesmo assim esta implementação é impressionante pelo sucesso que (segundo se diz) se consegue, principalmente por ser na linguagem que é.

JJ

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
PS: É claro que a programação em C perde todo o seu requinte com isto. xD Sim, concordo que quem quer ter as vantagens de um GC não deve usar C. Mas mesmo assim esta implementação é impressionante pelo sucesso que (segundo se diz) se consegue, principalmente por ser na linguagem que é.

Por acaso há coisas em que isto não se aplica. Por exemplo, há bibliotecas de exception handling para C que acho que todos os projectos sérios em C deviam adoptar.

JJ

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora