2012-04-02 13 views
1

私は、高校を卒業したときに、学習経験と私の履歴書の両方のために、直近の週末に私自身のスクリプト言語を書き始めました。これまでのことがうまくいったので、基本型(null、boolean、number、string)と演算子の優先順位を持つ数式を解析して、基本的なマークとスイープガベージコレクタを用意しました(マーク/スイープコレクタ私は世代のガベージコレクタを実装します、私は素朴なマーク/スイープが非常に高速ではないことを知っています)。私は、ガベージコレクタのために参照されたオブジェクトをどのように格納するかは確信しています。現時点では、私はそれのメモリへのポインタと、マークされているかどうかを示すクラスGCObjectを持っています。リンクされたリストをそのクラスの参照されたオブジェクトに格納する必要がありますか?私は他の言語のガベージコレクタを見てきましたが、GCObjectごとにリンクされた参照リストはないので、混乱しています。マークとスイープガベージコレクタへの参照の保存方法は?

TLDR:他のオブジェクトによって参照されているオブジェクトをマーク掃引ガベージコレクタに格納するにはどうすればよいですか?すべてのGCObjectにオブジェクトのリンクリストを保存するだけですか?

ありがとうございます。

答えて

3

通常、オブジェクトへの参照は、それらの参照が自然に発生する場所以外の場所には格納されません。マーク操作中に、どの参照がオブジェクトを指しているかを知る必要はありません。むしろ、オブジェクト(またはルート)に含まれる参照を知る必要があるため、それらのオブジェクトを再帰的にマークすることができます。

スイープフェーズでは、すべてのオブジェクトを反復処理して、参照されていないオブジェクトを確定し、そのストレージを割り当てプールに戻すこともできます。どのようにこれを正確に行うかは、汎用のアロケータに依存します。カスタムアロケータを記述したいと思うかもしれません。

(私はあなたが圧縮をしたくないと思っています - それはずっと複雑です)。

+0

はい私は既にオブジェクトを反復処理する方法を持っていますが、リンクリストに格納されている参照を格納する必要があるのか​​、それとも何か別の方法でそれを行うべきかどうかは疑問でした。リンクされたリストはちょっと残酷すぎるようです。 –

+0

あなたは誤解されているようです。あなたは "根源的な参照"をリストやその他のものに保存する必要はありません。これらの参照はすでにルートに格納されています。 – davmac

+0

彼らはどうやって根に保存されているのですか、それは私が求めていたものです。しかし、私はすでに答えを他のところで見つけました。とにかく、ありがとう。 –

関連する問題