boost::variantは値型であると主張しています。これはboost :: variantの生の表現を単純に書き出し、POD型だけを含んでいれば後で読み戻すのが安全だということですか?同じアーキテクチャ上で、同じコンパイラと同じバージョンのboostでコンパイルされたコードによってリロードされると仮定します。raw boost :: variantをシリアル化するのは安全ですか?
また、(おそらく)同様に、boost :: variantを共有メモリで使用できますか?
boost::variantは値型であると主張しています。これはboost :: variantの生の表現を単純に書き出し、POD型だけを含んでいれば後で読み戻すのが安全だということですか?同じアーキテクチャ上で、同じコンパイラと同じバージョンのboostでコンパイルされたコードによってリロードされると仮定します。raw boost :: variantをシリアル化するのは安全ですか?
また、(おそらく)同様に、boost :: variantを共有メモリで使用できますか?
シリアライゼーションについて:はい。しかし、あなたはboost::variant
の訪問メカニズムを使って、そのバリアントに含まれる実際のタイプを書き出してみませんか?共有メモリについて
struct variant_serializer : boost::static_visitor<void> {
template <typename T>
typename boost::enable_if< boost::is_pod<T>, void>::type
operator()(const T & t) const {
// ... serialize here, e.g.
std::cout << t;
}
};
int main() {
const boost::variant<int,char,float,double> v('1');
variant_serializer s;
boost::apply_visitor(s, v);
return 0;
}
:あなただけint
のような共有メモリにそれを置くことができるようにboost::variant
はもちろん、適切な同期を想定し、ヒープ割り当てを実行しません。
あなたが言ったように、上記は、バリアントがPODタイプのみを含むことができる場合にのみ有効です。
私は、実際のタイプを書くために定型コードをたくさん書くのを避けたいと思っています:) – bdonlan
あまり定型的なコードは必要ありません。上記を参照 –
boost/serialization/variant.hppを含めてみてください。それはあなたのための仕事です。
これはPODタイプでも機能しますか?ブースト::変形のようなstd :: string – SeniorLee
の見た目はPODタイプではない(さもなければあなたはタグ付きのユニオンを使うことができました)、私はそう思っていますが、クイックテストで確認できます。 – spiderlama
PODの単なる構造体であっても、生のメモリ表現を吐き出すことは賢明ではなく、コンパイラのパディングレイアウト、アーキテクチャの詳細、およびエンディアンの慈悲に惑わされます。 – Thanatos
当時私は、レイアウトの違いがまったく問題にならない共有メモリの使用にもっと興味を持っていました。 – bdonlan