家に帰って早速作ってみた。C言語から使えるGCとしてはBohemGCが有名であるが、あれはmark-and-sweepだったはずなので、あんまりパフォーマンスはよくないと思われる。潜在的パフォーマンスはもっと高いと言える。今回の実装を説明する。メモリを確保する関数。確保したメモリは参照が外れると勝手に回収される。明示的にGCを起こさせる。}with_gcはこのように使う。gc_mainをユーザプログラムのエントリポイントとする。テストプログラムを走らせて見る。...(以下略)見事落ちることなく走り続ける。当然のことながら生き残るメモリは0バイトである。大体数十倍の性能を記録した。次にオブジェクトを生存させてみる。}丁度一回GCが起こるようにmallocの回数を調節する。12345678今度はルートがマークされ、メモリが残っているのが分かる。バイト数がおかしいのは、gc_mallocではメモリブロックにヘッダを付与しているためである。コピーGCなので、pの値が勝手に変わっていることに注目。メモリの内容はちゃんと最初と等しい。次に構造体経由での参照を扱ってみる。なっているのは些細なことなので、気に留めないように。3オブジェクト生き残っている。次に循環参照を持つ場合を試す。...12345678当然ながらこれは回収されてはいけない。...注1にて別関数にくくりだしているのや注2でgc_mallocを読んでいるのは一時的に残ってしまうかもしれないポインタへを破壊するためなので、意味のある事ではない。実行結果はこれまた当然のことながらちゃんと全部回収されている。writeup月別アーカイブはてなブログをはじめよう!tanakhさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。