Арифметика указателей не является фундаментальной проблемой. GC приходится иметь дело с переназначением указателей все время, и арифметика указателей является еще одним примером этого. (Конечно, если разрешить арифметику указателей между указателями, указывающими на разные буферы, это вызовет проблемы, но это не так. Единственная арифметика, которую вам разрешено выполнять с указателем, указывающим на массив A, - это те, которые перемещают его в этом массиве.
Проблема real заключается в отсутствии метаданных. GC должен знать, что является указателем, а что нет.
Если оно встречает значение 0x27a2c230
, оно должно быть в состоянии определить, является ли оно
- указатель (в этом случае он должен следовать за указателем, чтобы рекурсивно пометить пункт назначения как «используемый»)
- Целое число (То же значение является вполне допустимым целым числом. Возможно, это вообще не указатель)
- или что-то еще, скажем, немного строки.
Он также должен иметь возможность определять степень структуры. Предполагая, что значение является указателем, и оно указывает на другую структуру, GC должен иметь возможность определять размер и размер этой структуры, поэтому он знает, какой диапазон адресов следует сканировать для большего количества указателей.
Языки GC имеют много инфраструктуры для решения этой проблемы. C ++ не делает.
ГК Boehm является самым близким, который вы обычно можете получить, и он консервативен в том, что, если что-то может быть указателем, ГК предполагает, что он является единым, что означает, что некоторые данные без необходимости поддерживаются живыми. И поэтому он, скорее всего, сохранит данные, которые должны быть GC-файлами.
В качестве альтернативы, конечно, вся эта инфраструктура может в принципе быть добавлена в компилятор C ++. В стандарте нет правила, по которому нельзя существовать. Проблема заключается в том, что это сильно снизит производительность и исключит множество возможностей для оптимизации.