Это может показаться странным, но я постараюсь объяснить это. Я сейчас пользуюсь boost.object_pool широко в сочетании с shared_ptr, и недавно я столкнулся с ситуацией, когда мне нужно сделать снимки текущих состояний программы, чтобы сделать функциональность такой, как полномасштабная Повтор / откат / ускоренная перемотка вперед.
Поэтому я не пытаюсь клонировать пул объектов для использования в другом месте, это не сработает, очевидно, потому что даже если мне позволят сделать это с помощью интерфейса boost.pool (а я нет), не будет никаких действительных указателей, указывающих на чанки в этом недавно клонированном пуле, и это было бы просто бессмысленно. Но мой вариант использования здесь я хочувставитьmsgstr «вернуть обратно в исходный пул, если есть необходимость в повторном воспроизведении.
Я, конечно, могу просто скопировать и клонировать все состояния, объекты и подсостояния, подобъекты и подподчинение … вручную, а затем упаковать их в снимок, и надеюсь, что все пойдет хорошо, но это подвержено ошибкам, учитывая сложность проект уже есть, и он должен быть намного медленнее, чем если бы я мог просто скопировать память напрямую. Использование шаблона Command (или тому подобного) для достижения отмены-повтора также совершенно исключено, поскольку механизм отмены-повторения не является моей целью.
Мне просто интересно, смогу ли я сделать проект с нуля снова, используя твердый традиционный C-способ, и простой вызов memcpy (snapshot, all_states, size) сделал бы почти всю работу.
Есть ли какой-то другой вариант, который мне все еще не хватает? Есть ли какая-либо реализация типа boost.object_pool, которая позволяет вам клонировать нижележащую область памяти? Является ли навязчивый взлом boost.object_pool вероятным вариантом, учитывая ситуацию?
Не то, что я знаю из.
Как вы заметили, основной проблемой здесь является наличие возможных взаимозависимостей между объектами, что требует обновления указателей при создании копии. Конечно, нетривиально.
Я могу придумать два возможных решения:
живучесть о том, чтобы никогда не мутировать существующее государство. Когда вы меняете состояние, вы тем самым создаете новый снимок, который ссылается на старое состояние, за исключением новых битов. Например, он обычно используется в реализациях баз данных MVCC и широко распространен в мире функционального программирования. Это также хороший способ получить утечки в космосе, если вы попытаетесь сохранить слишком много ссылок. Наконец, требуется глубокая реинжиниринг.
Сериализация о сохранении состояния, но в другом формате. Вы сбрасываете текущее состояние в формате сериализации (текстовом или двоичном) и можете восстановить его, считав сериализованный буфер. Вы можете даже применить сжатие к сериализованному буферу, чтобы сэкономить память.
Поскольку вы уже используете Boost, будьте рады узнать, что Boost.Serialization
автоматически обрабатывать графики объектов (да!), и я думаю, что уже правильно работает с boost::shared_ptr
, Это может быть вашим лучшим вариантом здесь.
Других решений пока нет …