Любая реализация клонируемого пула объектов в C или C++?

Это может показаться странным, но я постараюсь объяснить это. В настоящее время я широко использую boost.object_pool в сочетании с shared_ptr, и недавно я столкнулся с ситуацией, когда мне нужно сделать снимки текущих состояний программы, чтобы сделать такие функции, как полномасштабное воспроизведение / откат / быстрая перемотка вперед.

Поэтому я не пытаюсь клонировать пул объектов для использования в других местах, это, очевидно, не сработает, потому что даже если мне позволят это делать с помощью интерфейса boost.pool (а это не так), не будет действительных указателей, указывающих на чанки. в этом недавно клонированном пуле, и это было бы просто бессмысленно. Но мой вариант использования здесь - я хочу " вставить " его обратно в исходный пул, если есть необходимость воспроизведения / отката.

Я, конечно, могу просто скопировать и клонировать все состояния, объекты и подсостояния, подобъекты и субподразделение... вручную, а затем упаковать их в снимок, и надеюсь, что все пойдет хорошо, но это подвержено ошибкам, учитывая сложность проект уже есть, и он должен быть намного медленнее, чем если бы я мог просто скопировать память напрямую. Использование шаблона Command (или тому подобного) для достижения отмены-повтора также совершенно исключено, поскольку механизм отмены-повтора не является моей целью.

Мне было просто интересно, если я сделаю проект с нуля снова, используя твердый традиционный C-способ, и простой вызов memcpy (snapshot, all_states, size) сделает почти всю работу.

Есть ли какой-то другой вариант, который я все еще пропускаю? Есть ли какая-либо реализация типа boost.object_pool, которая позволяет вам клонировать нижележащую область памяти? Является ли навязчивый взлом boost.object_pool вероятным вариантом, учитывая ситуацию?

1 ответ

Не то, что я знаю из.

Как вы заметили, основной проблемой здесь является наличие возможных взаимозависимостей между объектами, что требует обновления указателей при создании копии. Конечно, нетривиально.

Я могу придумать два возможных решения:

  • живучесть
  • Сериализация

Настойчивость заключается в том, чтобы никогда не мутировать существующее состояние. При изменении состояния вы, таким образом, создаете новый снимок, который ссылается на старое состояние, за исключением новых битов. Например, он обычно используется в реализациях баз данных MVCC и широко распространен в мире функционального программирования. Это также хороший способ получить утечки в космосе, если вы попытаетесь сохранить слишком много ссылок. Наконец, требуется глубокая реинжиниринг.

Сериализация - это сохранение состояния, но в другом формате. Вы сбрасываете текущее состояние в формате сериализации (текстовом или двоичном) и можете восстановить его, считав сериализованный буфер. Вы можете даже применить проход сжатия к сериализованному буферу, чтобы сэкономить часть памяти.

Поскольку вы уже используете Boost, будьте рады узнать, что Boost.Serialization автоматически обрабатывать графики объектов (да!), и я думаю, что уже правильно работает с boost::shared_ptr, Это может быть вашим лучшим вариантом здесь.

Другие вопросы по тегам