2

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

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

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

4

1 回答 1

1

不,一般来说是不可能的。假设您使用XOR 技巧来实现链表;那么指针仍然在“隐式”周围(可以重建),但是如果不知道 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 都使用启发式算法来处理指针算术技巧。例如,参见Hans Boehm 的保守 GC保守在这里意味着它认为几乎所有东西都是潜在的指针。

于 2011-06-08T09:31:12.790 回答