2012-04-02 16 views
1

我開始在最近的週末編寫自己的腳本語言,以便在高中畢業時獲得學習體驗和簡歷。到目前爲止事情已經變好了,我可以用基本類型(空,布爾,數字和字符串)和具有運算符優先級的數學表達式來解析變量,並且具有基本標記和清理垃圾回收器(在完成標記/清掃收集器之後我會實施一代垃圾收集器,我知道天真的標記/掃描不是很快)。不過,我不確定如何存儲垃圾收集器的引用對象。截至目前,我有一個GCObject類,它存儲一個指向它的內存的指針,以及它是否被標記。我應該存儲一個鏈表到它在類中被引用的對象嗎?我查看了其他語言的垃圾收集器,但是我沒有看到每個GCObject的引用鏈接列表,所以它讓我感到困惑。如何將引用存儲在標記和清除垃圾回收器中?

TLDR:如何將其他對象引用的對象存儲在標記和清除垃圾回收器中?我是否只在所有GCObject中存儲鏈接的對象列表?

謝謝你們。

回答

3

您通常不會將引用存儲在任何對象中,除了那些引用自然出現的位置。在標記操作期間,您不需要知道哪些引用指向一個對象;相反,您需要知道對象(或根)包含哪些引用,因此您可以遞歸地標記這些對象。

對於掃描階段,您還需要遍歷所有對象的方法,以便最終確定任何未引用的對象並將其存儲返回到分配池。你如何做到這一點完全取決於你的通用分配器 - 你可能想寫一個自定義的分配器。

(我假設你不想壓實 - 這是一個更復雜的事情)。

+0

是的我已經有一種方法來遍歷對象,我想知道如果我應該存儲鏈接列表中的根存儲的引用,或者如果有其他方式,我應該這樣做。鏈接列表似乎有點矯枉過正。 – 2012-04-02 23:32:00

+0

你似乎是誤會。您不需要將「根存儲的引用」存儲在列表中或其他任何內容中;這些引用已經存儲 - 在根。 – davmac 2012-04-03 21:44:07

+0

但是,它們是如何存儲在根中的,這正是我所要求的。但我已經在其他地方找到了答案。不管怎麼說,多謝拉。 – 2012-04-04 16:35:51