用指针算法引用语言GC

时间:2011-06-08 09:04:51

标签: programming-languages garbage-collection reference-counting

我想知道是否可以在允许指针算术的语言中实现基于引用计数的GC。例如(这是伪C),

int* f()
{
    int array[5] = { 1, 2, 3, 4, 5 };
    int *ptr = array + 3;
    return ptr;
}

在这种情况下,编译器是否可以正确管理内存?

1 个答案:

答案 0 :(得分:1)

不,一般情况下都不可能。假设您使用XOR trick来实现链接列表;那么指针仍然是“隐式地”(可以重建),但是如果不知道XOR技巧如何工作以及何时使用它,GC就无法找到它们。它可能认为每个元素的引用数为零。为了欺骗具有XOR技巧知识的GC,可以通过例如设计变体来设计变体。包括XOR中的某种盐。

另外,请考虑引用计数C必须如何处理:

void *ptr = WHATEVER;      // first reference
uintptr_t ptr_temp = ptr;  // second reference
unsigned char ptr_copy[sizeof(uintptr_t)];
memcpy(ptr_copy, ptr_temp, sizeof(uintptr_t)); // third reference

每个C / C ++的通用GC都使用启发式方法来处理指针运算技巧。例如,请参阅conservative GC of Hans Boehm保守在这里意味着它只考虑所有可能的指针。