ポインタ演算が可能な言語で参照カウントベースのGCを実装できるかどうか疑問に思いました。たとえば(これは疑似Cです)、
int* f()
{
int array[5] = { 1, 2, 3, 4, 5 };
int *ptr = array + 3;
return ptr;
}
このシナリオでコンパイラがメモリを正しく管理することは可能でしょうか?
ポインタ演算が可能な言語で参照カウントベースのGCを実装できるかどうか疑問に思いました。たとえば(これは疑似Cです)、
int* f()
{
int array[5] = { 1, 2, 3, 4, 5 };
int *ptr = array + 3;
return ptr;
}
このシナリオでコンパイラがメモリを正しく管理することは可能でしょうか?
いいえ、一般的にはありえません。XOR トリックを使用してリンク リストを実装するとします。その場合、ポインターは引き続き「暗黙的に」(再構築可能) 存在しますが、GC は、XOR トリックがどのように機能し、いつ使用されているかを知らなければ、ポインターを見つけることができません。各要素の参照数がゼロであると考える場合があります。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 を参照してください。ここで保守的とは、ほぼすべてのものを潜在的なポインターと見なすことを意味します。