3 回答

TA貢獻(xiàn)1794條經(jīng)驗 獲得超8個贊
如前所述,存在假設(shè),那就是東西GC的管理地址的每個位模式的GC是實際上是一個指針(所以不要松開東西)。這實際上可以很好地工作,因為調(diào)用指針通常大于小的公共整數(shù),并且通常必須對齊。但是是的,這可能導(dǎo)致某些對象的收集被延遲。Boehm C的收集器以這種方式工作,因為它是基于庫的,因此不會從編譯器獲得任何特定的幫助。
還有一些GC與它們所使用的語言緊密相關(guān),并且實際上知道內(nèi)存中對象的結(jié)構(gòu)。我從沒專門閱讀過堆棧幀處理方面的文章,但是如果編譯器和GC設(shè)計為可以協(xié)同工作,則可以記錄信息以幫助GC。一種技巧是將所有指針引用放在一起,并在每個堆棧幀中使用一個字來記錄有多少個指針,這并不是那么大的開銷。如果您可以找出與每個堆棧框架相對應(yīng)的功能而無需添加一個單詞,那么您可以編譯每個功能的“堆棧框架布局圖”。另一種選擇是使用帶標(biāo)簽的單詞,在該位置設(shè)置低不是指針1的單詞的順序位(由于地址對齊),指針永遠(yuǎn)不需要,因此您可以將它們區(qū)分開。

TA貢獻(xiàn)1891條經(jīng)驗 獲得超3個贊
Haskell堆棧在每個堆棧幀中使用一個內(nèi)存字(使用位圖)描述該堆棧幀中的哪些值是指針,哪些不是指針。
公平地說,考慮到所有因素,僅需一個內(nèi)存字就不會花費(fèi)太多。您可以將其視為僅向每個方法添加一個變量。那還不是那么糟糕。
- 3 回答
- 0 關(guān)注
- 229 瀏覽
添加回答
舉報