読者です 読者をやめる 読者になる 読者になる

レガシーコード生産ガイド

私に教えられることなら

ガベージコレクションに挑戦

プログラミング

ガベージコレクションアルゴリズムと実装」が届いてから、たまにペラペラとめくってて、「なるほどなるほどな〜」と楽しんでた。でも実際に書くのは先延ばしにしてたんだけど、練習用リポジトリを作ったらCを書くのが楽しくなったので勢いでMark&Sweep GCを書いてみた。

c-sketchbook/008.mark_sweep_gc at master · phaendal/c-sketchbook · GitHub

リンクリストにmapするんだけど、そのとき生成したコンスセルをMark&Sweep GCで掃除している。サイズの計算なんかはCの配列とmallocとfreeに任せた。なんとか上手くいった、上手くいった可能性はある……?ちょっとメモリリークしてるかもだけど、map中に手で解放すべきかどうか管理してるからで、最終的にLispとか処理系作ってその上の変数から辿るようにしたら大丈夫、かな。。とりあえずvalgrindで調べたら終了後のリークは無いので良しとする。valgrindめちゃ便利。

実行結果

initialize,   40 objects free
   1    2    3    4    5         normal   30 objects free
   1    4    9   16   25         square   20 objects free
   2    3    4    5    6            inc   10 objects free
   4    9   16   25   36  inc -> square    0 objects free
<garbage collected>     2 objects free
<garbage collected>     4 objects free
<garbage collected>     8 objects free
   1   16   81  256  625           quad    4 objects free
<garbage collected>     6 objects free
   2   17   82  257  626     inc -> inc    0 objects free
<garbage collected>     2 objects free
<garbage collected>     4 objects free
<garbage collected>     8 objects free
   1   16   81  256  625           quad    4 objects free
<garbage collected>    10 objects free
   1   16   81  256  625           quad    4 objects free
<garbage collected>    10 objects free
   1   16   81  256  625           quad    4 objects free
   1    2    3    4    5         normal    4 objects free
    4 objects free
広告を非表示にする