3

IPC の共有メモリ (shm) にリング バッファーを実装するために、boost::interprocess のベクター コンテナーの周りに単純なラッパーを作成しています。がshmで作成されbufたインスタンスであるとします。RingBuffer現在、その ctor で、bufそれ自体が値を格納するためにプライベートboost::interprocess::vectorデータ メンバーを割り当てますm_datam_data私の質問は、共有メモリにも作成する必要があると思います。しかし、これは必需品ですか?

それがshm自体で作成され、標準メモリを割り当てた場合buf、つまりnew. これは呼び出しプロセスのヒープに割り当てられますか? そこに割り当てられているとは思わないbufので、プロセスのヒープ上にないオブジェクトにプライベートなデータメンバーがそこに割り当てられるのはなぜですか。よくわかりません。

4

1 に答える 1

3

boost::interprocess::vectorテンプレート パラメーターとしてアロケーターの型を取ります。このアロケータは、共有メモリから割り当てる必要があります (使用例を参照)。

クラスでメモリを割り当てるとnew、そのメモリは割り当てられたプロセスからのみアクセスできます。これは間違っており、まさにboost::interprocess::vector共有メモリ アロケータが必要な理由です。

ctor では、buf 自体がプライベートな boost::interprocess::vector データ メンバーを割り当てます。

これは私には意味がありません。C++ では、コンストラクターでデータ メンバーを "割り当てる" ことはできません。データ メンバーはクラス本体で定義され、そのクラスの各オブジェクトの一部です。それらはオブジェクトと同じメモリにあります。これは、4 バイト整数の中間バイトが整数と同じメモリにあるのと同じ理由でです。

プロセスのヒープ上にないオブジェクトにプライベートなデータメンバーがそこに割り当てられるのはなぜですか

メモリは、割り当てを要求する方法で割り当てられます。割り当てた場合new(そしてオーバーロードされていない場合)、プロセス メモリに割り当てられます。共有メモリ セグメント マネージャ (Boost がそう呼んでいると思います。実際にこれらの API を自分で使用したことはありません) を使用して割り当てると、共有メモリに割り当てられます。呼び出しを含むクラスと、割り当てられたメモリへのポインターを格納するデータ メンバーは、それとは何の関係もありません。

于 2010-03-17T04:20:59.690 に答える