我想知道是否可以在允许指针算术的语言中实现基于引用计数的GC。例如(这是伪C),
int* f()
{
int array[5] = { 1, 2, 3, 4, 5 };
int *ptr = array + 3;
return ptr;
}
在这种情况下,编译器是否可以正确管理内存?
答案 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。 保守在这里意味着它只考虑所有可能的指针。