Оптимизация
Только что описанный алгоритм способен резко тормозить программу при каждом запуске функции Scavenge(). Для оптимизации по отдельности или вместе могут использоваться два следующих подхода:
1. Функция Scavenge() работает поэтапно, а не как единая операция. Для этого вам придется
модифицировать Copy1(), чтобы ее последовательный аналог вызывался до завершения
сборки мусора.
2. Ведение отдельных списков используемых ведущих указателей для каждой половины вместо перебора содержимого VoidPtrPool для их поиска. При перемещении каждого объекта из неактивной половины в активную ведущий указатель также перемещается из одного списка в другой. В конце цикла уплотнения для неактивной половины остается список лишь тех ведущих указателей, которые должны быть уничтожены.
Вряд ли эти варианты оптимизации стоит применять в реальных проектах - особенно второй, поскольку ведение списков потребует значительно больших затрат памяти и быстродействия.