Чтобы сохранить данные в том же разделе памяти, вы, вероятно, захотите предоставить объект Allocator для std::vector<TreeElement *>
, который вы используете, и получить его из вашего блока.
Чтобы иметь возможность сериализовать его, вместо хранения фактических указателей, вы можете рассмотреть возможность хранения смещений в блоке. Затем, когда вы читаете данные обратно, вы можете добавить адрес начала блока к каждому смещению, чтобы превратить его обратно в адрес.
В зависимости от используемой вами ОС / компилятора, возможно, уже есть некоторая поддержка. Например, компилятор Microsoft поддерживает указатели __based
, которые в значительной степени соответствуют описанному мною: базовый адрес, и каждый указатель, основанный на этом адресе, на самом деле является просто смещением, а не полным указателем. Упоминание mmap
указывает на то, что это, вероятно, не доступно вам напрямую, но возможно , что используемый вами компилятор / ОС имеет нечто подобное. В противном случае вам, вероятно, придется выполнять работу самостоятельно (например, с классом based_pointer
).
Реальный вопрос в том, почему вы вообще пытаетесь сериализовать дерево перемещений. В типичном случае вам лучше просто сохранить текущую позицию доски (или, что примерно то же самое, историю ходов) и заново сгенерировать дерево ходов из этого, когда / при необходимости. Этого достаточно меньше, чтобы его было действительно легко хранить.