なんかうかつに読んでると、「これじゃうまく動かないんじゃ!?」と思ってあわてるんだけど、よくよく追ってみるとちゃんと動きそうだとわかる。 まるで気が抜けない…。
想定している知識が、C、ポインタ、union、メモリ構造、テンプレート、他にいろんな言語とか超スパルタン、ガチ過ぎる。
1ビット参照カウント
- 大抵のオブジェクトは1つからしか参照されないのでカウンタは1ビットでもいいんじゃない?ってことで結構いいかも、と思ってたんだけど、よく考えたら例えばコンテナに突っ込んだり、関数に渡したり、ヘタしたら関数内で生成したオブジェクトを返そうとしただけでカウンタが2になって振り切れちゃうので、ほとんどうまくいかないんじゃないかという気がしてきた。
部分マークスイープ法
- リスト16:
dec_ref_cnt()
の3~4行目でカウンタが0になったときにdelete(obj)
してるけど、オブジェクトの色がハッチだったときはキューに登録されてるのでそれを取り除かないとまずいのではないか? - リスト17:
new_obj()
の9行目は値を戻すのでreturn new_obj(size)
途中まで読んで
- 1.8 ルート(19ページ)のfor文で
roots
に$
がついてない - 「3.6.1 ビット参照カウント」で
tag()
やset_multiple_tag()
やdelete_ptr()
が、渡したポインタじゃなくてそれが参照するオブジェクトを対象とするのがすごくわかりにくい気がするtag()
やset_multiple_tag()
が示されてないのもあるんだけどtag()
はオブジェクトのタグを調べる関数にして、delete_ptr()
じゃなくてdec_ref_cnt_1bit()
に変更して、あとコピー前にMULTIPLEタグをつけるようにしたらわかりやすいのではないか?
copy_ptr(dest_ptr, src_ptr){ |
- オブジェクトの色分けだけど犯人かどうかと同じに、完全にゴミなら黒、完全に生きてるなら白、ゴミかもしれないならグレーがいいなぁと思った。なんかの論文で本のような色分けだったらあれですけど。
- 11章のコラム「なぜRubiniusのGC解説を?」に「RHG」がある