4

プロセス (C++) 間で CGAL のジオメトリを送信する最速の方法を探しています。A と B の 2 つのプロセスがあるとします。プロセス A はジオメトリを生成し、プロセス B はそれを表示しています。利用可能な最速の方法でそれらを接続したい。ジオメトリは CGAL 多面体タイプです。

共有メモリを使用できることはわかっていますが、いくつか問題があります。

  1. プロセス A から共有メモリにジオメトリをコピーしたい場合、オフ形式との間でストリーミング多面体を使用できますが、この形式への変換は私の目的には遅すぎるため、興味がありません。
  2. 共有メモリを作成し、「placement new」を使用して共有メモリ内にオブジェクトを作成し、ストリーミングと変換のオーバーヘッドを克服できますが、内部多面体関数によるメモリ割り当てをそれ以上制御することはできません。(たとえば、Polyhedron_incremental_builder_3 で新しい頂点を追加する場合、メモリ内のどこに配置するかを正確に指定することはできません。B.add_vertex( Point( 0, 0, 0)) を呼び出すだけで済み、メモリ割り当てはそのメソッドで処理されます。初めの)

共有メモリ内の特定の場所にオブジェクトを作成し、それとその動的構造がこのメモリ内で「生きている」ことを確認する方法はありますか?

それとも、2 つのプロセス間で動的データ (つまり、Halfedge 構造) を共有する別の高速な方法があるのでしょうか?

4

2 に答える 2

1

内部の多面体関数によるメモリ割り当てをこれ以上制御することはできません。

あなたは実際にコントロールを持っています。

リファレンスマニュアルには次のように書かれています。

クラスPolygon_2はポリゴンを実装します。Polygon_2は、トレイトクラスとコンテナクラスによってパラメータ化されます。後者は、STLコンテナの要件を満たす任意のクラスにすることができます。デフォルトはベクトルクラスです。

ポリゴン自体に新しい配置を使用することに加えて、共有メモリに配置できるコンテナが必要です。boost::interprocess::vectorを使用するか、独自のコンテナクラスをロールすることができます。

を使用する場合はboost::interprocess::vector、そのラッパークラスを作成する必要があります。これは、STLコンテナーとは異なり、そのコンストラクターにはアロケーターオブジェクトが必要なためです。Polygon_2正しく構築することはできません。したがって、ある種のグローバル変数から共有メモリアロケータオブジェクトを取得する必要があります。例えば:

using namespace boost::interprocess;
typedef allocator<int, managed_shared_memory::segment_manager>  ShmemAllocator;
ShmemAllocator some_global_shmem_allocator;
template <typename T>
class my_shared_memory_vector : vector<T, ShmemAllocator>
{
public:
  my_shared_memory_vector() : vector(some_global_shmem_allocator) {}
};

免責事項:私は実際にこれを自分で行ったことがありません。これを行った結果、コンピューターが炎上し、家が全焼した場合でも、私に責任を負わせないでください。(GCALソースを見て)メモリPolygon_2が割り当てるものが実際にコンテナによって管理されていることを再確認することをお勧めします。

編集:私は質問を読み間違えました、それはポリゴンではなく多面体について尋ねます。以下のコメントを参照してください。

于 2012-09-29T23:08:11.140 に答える
0

もちろん、最も明白なことは、プロセスの代わりにスレッドを使用することです。そうすれば、何の努力もせずに問題全体を解決できます。

それ以外に、コンパイラのランタイム ライブラリをハッキングしてメモリ管理を置き換える以外に、クラスの「operator new」を実際にオーバーライドしたり、グローバルなものを提供したりできます。これにより、「新しい」呼び出しを独自のメモリ割り当てコードに置き換えることができます。CGAL 呼び出しを行う前に設定し、後でリセットするグローバル フラグを使用して、使用するメモリ ヒープをメモリ アロケータに伝えることができます (明らかに、共有メモリのヒープ管理の何らかの形式を作成する必要があります)。

もちろん、新しい演算子のオーバーライドは、「新しい」呼び出しに対してのみ機能します。malloc() やシステム コールなどによって割り当てられるものはすべて、コードを通過しません。独自の malloc() および free() 呼び出し (オブジェクト ファイルに含まれる関数は、ライブラリの関数よりも優先されます) を提供して、これが機能するかどうかを確認することもできますが、メモリ管理のためにオペレーティング システムを処理する必要がある可能性があります。ライブラリ関数が失われるためです。ぐちゃぐちゃになること間違いなしです。

于 2012-09-29T22:45:14.850 に答える