メモリの同じセクションにデータを格納するには、使用するstd::vector<TreeElement *>
のAllocatorオブジェクトを指定し、そのブロックから割り当てる必要があります。
実際のポインタを格納する代わりに、シリアル化できるようにするには、ブロックにオフセットを格納することを検討してください。次にデータを読み込むと、ブロックの開始アドレスを各オフセットに追加してアドレスに戻すことができます。
使用しているOS /コンパイラによっては、すでにサポートされているものがあります。たとえば、マイクロソフトのコンパイラは__based
ポインタをサポートしていますが、それは私が記述したものです。ベースアドレスと、そのアドレスに基づく各ポインタは実際にはオフセットであり、フルポインタではありません。 mmap
の記載は、それがおそらくあなたに直接利用できないことを示していますが、が可能です。あなたが使用しているコンパイラ/ OSには類似したものがあります。それ以外の場合は、自分でジョブを実行する必要があります(例:based_pointer
クラス)。
実際の質問は、なぜあなたが移動ツリーをまったくシリアル化しようとしているかということです。典型的なケースでは、現在のボードの位置(または同等のことに、移動履歴)を保存し、必要なときに移動ツリーを再生成する方が良いでしょう。十分に小さいので、保存するのが簡単です。
ポインタを含んでおり、 'vector'を使用するので、何らかの形でシリアライズせずにその構造体をファイルに保存することはできません。 –
これは3つの非常に広範で非常に異なる質問で、1つにまとめられています。お願い、それはやめて。 –
私はノードに名前をつけて(ちょうどポインタ値を使う)、深さ優先オーダーサーチでツリーを横断しようとします。このように、次のような順序付き1次元配列を生成できます:[{node:1、move:..、parent :0}、{ノード:2、移動:..、親:1}、{ノード:3、移動:..、親:2}、{ノード:4、移動:..、親:3} – arthurprs