Я изучаю вопрос интеграции gc в мой проект llvm, и когда я прочитал этот документ , меня смутило одно предложение:
Однако для сборщика, который пожелаетчтобы переместить объекты, непосредственно достижимые из выполняющегося кода, требуется более высокий стандарт.
Я не понимаю, что такое движение "перемещать объекты, достижимые непосредственно из выполняющегося кода", пытается сделать.
Для моей информации, понятие «перемещение» означает, что указатель gc ссылается на новое местоположение объекта, например:
в Java:
Foo foo = new Foo();
foo = new Foo(); // ---> a relocation happens
Так может кто-нибудь объяснить, что"перемещать объекты, непосредственно достижимые из выполняющегося кода", пытаясь это сделать?
Редактировать:
Что касается понятия "перемещение", документ не объясняет его, но я нашел этот документ , это компилятор для dotnet, который реализован llvm, он объяснил эту концепцию:
Алгоритм GC перемещается, если во время GC указатели GC могут обновляться для ссылки на новыйместонахождение объекта. Указатели обновления алгоритма найдены в определенных регионах, но не в других. Например, указатели GC из стека могут не обновляться, а указатели GC в куче могут быть обновляемыми. Если алгоритм перемещает указатели из всех регионов, он полностью перемещается. Когда GC перемещает указатели из некоторой области памяти, это обязательно означает, что отчеты GC являются точными в этой области.
Я не знаю, правильно ли я понимаю «перемещение», поэтому я вставляю это дляВаша информация.