簡體   English   中英

編譯為C時的垃圾收集

[英]Garbage collection when compiling to C

將垃圾收集語言編譯為C時,垃圾收集的技術有哪些? 我知道兩個:

  1. 維護一個影子堆棧,在數據結構中顯式保存所有根

  2. 使用像Boehm這樣的保守垃圾收集器

第一種技術很慢,因為你必須維護陰影堆棧。 每次調用函數時,都需要將局部變量保存在數據結構中。

第二種技術也很慢,並且由於使用了保守的垃圾收集器,本質上不會回收所有垃圾。

我的問題是:在編譯為C時,垃圾收集的最新技術是什么。注意,在C語言編程時,這並不意味着進行垃圾收集的方便方式(這是Boehm垃圾收集器的目標),只是一種方式編譯為C時進行垃圾收集。

每次調用函數時,都需要將局部變量保存在數據結構中。

不,你沒有 - 你可以將局部變量保留在C堆棧上並仍然遍歷它們:將所有引用變量放在一個數組中,並將一個指針添加到鏈接列表中,在輸入新的時將一個節點附加到該鏈接列表堆棧框架。

小樣:

struct vm
{
    struct scope *root;
};

struct scope
{
    struct scope *prev, *next;
    size_t size;
    struct ref *refs;
};

void foo(struct vm *vm, struct scope *caller)
{
    struct ref local_refs[42];
    struct scope scope = {
        caller, NULL, sizeof local_refs / sizeof *local_refs, local_refs };

    caller->next = &scope;

    // ...

    caller->next = NULL;
}

但是,如果你想支持延續/非局部跳躍,你將不得不跳過一些重大的箍。 在這種情況下,堆分配一切更容易。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM