5

これは奇妙に思えるかもしれませんが、私はそれを合理化しようとします。私は現在、 shared_ptrと組み合わせてboost.object_poolを広範囲に使用していますが、最近、本格的な再生/ロールバック/早送りなどの機能を作成するために、現在のプログラム状態のスナップショットを撮る必要がある状況に遭遇しました。

したがって、他の場所で使用するためにオブジェクトプールのクローンを作成しようとはしていません。これは、boost.poolのインターフェイス(私は許可されていません)によって許可されている場合でも、チャンクを指す有効なポインターがないため、明らかに機能しません。その新しく複製されたプールで、それは無意味でしょう。ただし、ここでの私の使用例は、再生/ロールバックが必要な場合に、元のプールに「貼り付け」たいというものです。

私は確かに、すべての状態、オブジェクト、サブ状態、サブオブジェクト、サブサブを手動でコピーして複製し、それらをスナップショットにパックして、すべてがうまくいくことを願っていますが、複雑さを考えるとエラーが発生しやすいですプロジェクトはすでに完了しており、メモリを直接コピーできる場合よりもはるかに遅くなる必要があります。コマンドパターン(または同様のもの)を使用して元に戻るを達成することも、元に戻るメカニズムが私の意図ではないため、かなり問題外です。

ダイハードの従来のCの方法を使用してプロジェクトを最初からやり直すかどうか疑問に思っていました。単純なmemcpy(snapshot、all_states、size)呼び出しで、ほとんどすべての作業を実行できます。

私がまだ欠けている他のオプションはありますか?基盤となるメモリ領域のクローンを作成できるboost.object_poolのような実装はありますか?状況を考慮すると、boost.object_poolを侵入的にハッキングすることはもっともらしいオプションですか?

4

1 に答える 1

2

私が知っていることではありません。

お気づきのように、ここでの主な問題は、コピーを作成するときにポインターを更新する必要があるオブジェクト間に相互依存関係が存在する可能性があることです。確かに自明ではありません。

考えられる解決策は次の 2 つです。

  • 持続性
  • シリアル化

永続性とは、既存の状態を変更しないことです。状態を変更すると、新しいビットを除いて古い状態を参照する新しいスナップショットが作成されます。これは通常、たとえばデータベースの MVCC 実装で使用され、関数型プログラミングの世界で普及しています。また、あまりにも多くの参照を保持しようとすると、スペース リークが発生する良い方法でもあります。最後に、徹底的な再設計が必要です。

シリアライゼーションは状態を永続化することですが、形式が異なります。現在の状態をシリアル化形式 (テキストまたはバイナリ) でダンプし、シリアル化されたバッファーを読み取ることでそれを再作成できます。シリアル化されたバッファーに圧縮パスを適用して、メモリを節約することもできます。

あなたはすでに Boost を使用しているので、Boost.Serializationがオブジェクトのグラフを自動的に処理することを知ってうれしいです (えー!) boost::shared_ptr。ここが最良の選択肢かもしれません。

于 2012-11-14T09:42:38.013 に答える