2012-11-14 3 views
5

これは奇妙に思えるかもしれませんが、私はそれを合理化しようとします。私は現在をboost.object_poolと広範囲にshared_ptrと一緒に使用していますが、最近フルスピードのような機能を実現するために、現在のプログラム状態のスナップショットを取る必要があります。リプレイ/ロールバック/早送りCまたはC++でクローン可能なオブジェクトプールを実装していますか?

他の場所で使用するオブジェクトプールを複製しようとしているわけではありませんが、明らかに動作しません。boost.poolのインタフェース(私はそうではありません)によって許可されていても、その新しくクローンされたプール内のチャンクを指し示すポインタとそれはちょうど意味がありません。しかし、ここでの私のユースケースは、リプレイ/ロールバックが必要な場合は、元のプールに戻って "paste"にしたいと思っています。

すべての状態、オブジェクト、サブ状態、サブオブジェクト、サブサブク...を手動でコピーしてスナップショットにパックして、すべてが正しくなることを願っていますが、プロジェクトがすでに持っている複雑さを考えれば、メモリを直接コピーするだけの場合よりもはるかに遅くなるはずです。アンドゥとリドゥを達成するためにコマンドパターン(または同様のもの)を使用することは、元に戻すやり直しの仕組みが私の意図ではないので、同様に疑問から外れています。

私はちょうどdie-hard伝統的なCの方法を使ってプロジェクトを最初からやっているのだろうと思っていました。単純なmemcpy(snapshot、all_states、size)コールはほぼすべての作業を行います。

まだ他にもオプションがありますか?基礎となるメモリ領域を複製するためのboost.object_pool実装がありますか?状況を考慮して、侵略的にboost.object_poolを妥当な方法でハッキングしていますか?

+0

類似したインターフェイスを持つ、コピー可能なオブジェクトプールを作成することは、難しく、時間がかかるようには見えません。 – Pubby

+0

@Pubby:グラフのような構造は決して簡単に複製できません。最も一般的な間違いは、無限のサイクルで立ち往生し、意図せずグラフを破っていることです。デバッグするのも面倒です。 –

答えて

2

これはわかりません。

ここでの主な問題は、コピーを作成するときにポインタを更新する必要があるオブジェクト間の可能性のある相互依存関係が存在することです。確かに自明ではない。私は2つの可能な解決策を考えることができ

  • 持続性
  • シリアライズ

持続性は、既存の状態を変異決してについてです。状態を変更すると、新しいビットを除いて古い状態を参照する新しいスナップショットが作成されます。これは、通常、データベースのMVCC実装で使用され、関数型プログラミングの世界で普及しています。あまりにも多くの参照をしようとすると、スペースリークを取得するのにも良い方法です。最後に、深いリエンジニアリングが必要です。

シリアライズは、持続状態ですが、別の形式です。現在の状態をシリアル化形式(テキスト形式またはバイナリ形式)でダンプし、シリアル化されたバッファを読み取って再作成することができます。シリアライズされたバッファに圧縮パスを適用することもできます。

すでにブーストを使用しているので、Boost.Serializationが自動的にオブジェクトのグラフを扱うことがわかりました。私はすでにboost::shared_ptrを正しく扱っていると思います。ここであなたの最善の選択肢かもしれません。

関連する問題