2013-11-28 3 views
5

は、構造体以下の点を考慮してください:私は、共有メモリ領域を作成するために、ブースト::プロセス間を使用していプロセス間メモリにboost :: optionalを使用するのは安全ですか?

struct ThingThatWillGoInSharedMemory { 
    boost::optional<int> opt_value; 
}; 

。 boost :: optionalの理解は、nullableポインタではなく、区別されたunionであるということでした。 ヒープを使用するstd :: mapやstd :: vectorのようなものは、プロセス間メモリで使用するために明示的なアロケータを必要としますが、boost :: optionalではヒープを使用しないことがわかりました。書面:

struct ThingThatWillGoInSharedMemory { 
    bool value_initialised; 
    int value; 
} 

したがって、そのまま使用することができます。もし誰かがこれを確認したら、私はうれしく思います。私は、プロセスの事例がboost :: optional docsに明示されているのを見ていませんでした。

答えて

1

あなたは正しいですか? boost :: optionalは、ポインタ間接を使用するのではなく、値をラップします。つまり、intなどの普通の古いデータオブジェクトは共有メモリ領域に存在することができます。一般に、ヒープを利用するオブジェクトは、このように使用することはできません。ブーストから

::オプションのドキュメント:オプションが付加価値であるから:

オプションとポインタの違いは、関係演算子の意味が異なっているので、特に、心に留めておかなければなりませんラッパー...

boost :: optionalは、ポインタと間接を使用せずに値をラップします。 boost :: optionalのメモリレイアウトの基本的なモデルは、多かれ少なかれ正しいです。実際の実装では、Tオブジェクトを初期化する必要がないように、汎用の整列バイトバッファをラップした共用体を使用します。ライブラリは、&(address-of)演算子を使用して、プロセスアドレス空間内のバイトバッファのローカルにマップされたアドレスを取得します。このローカルメモリアドレスは、T型のポインタまたは参照にキャストされます。

ソースコードは<boost/optional/optional.hpp>

で見つかりました。
関連する問題