2013-07-27 7 views
14

私は、Boost Variantとc/C++のデータ型がunionの違いは何ですか?私はunionデータ型が同じメモリ位置を占め、メモリ領域内の最大データ型が使用されるメモリの総量を占有することを知っている。 intfloat最大と等しい大きさであるのでブーストバリアントは基本的にc/C++のユニオンですか?

union space { 
    char CHAR; 
    float FLOAT; 
    int INTEGER; 
}S; 

は、メモリの4つのバイトを占有しなければなりません。 Boost Variantとunionデータ型の間には、他の点で類似点と相違点がありますか? Boost Variantは任意のデータ型を取ることができ、データ型 "多形性"を可能にすることも知っています(OOPトピックワードを誤って使用している場合は私を修正してください)。ユニオンのデータ型は多型の一種ですか?

答えて

11

ブーストバリアントは、ユニオンをエミュレートしますが、その実装ではユニオンを使用しません。代わりに、整列されたストレージと配置を使用します。

バリアントにビジターオブジェクトを適用すると、適切なオーバーロードが選択されるという意味で多態的です。この選択は実行時に行わなければなりませんが、このためのオブジェクトコードはコンパイル時に展開されます。だから、かなり速いです。

16

主な相違点は、Boostのバリアントはその中にどのタイプが格納されているかを知っているため、UBがユニオンと同じ方法でバリアントを誤用することはありません。これはまた、Variantが非POD(すなわち、実際に有用な)タイプを取ることを可能にする。バリアントには、訪問者と再帰的なバリアントの許可など、いくつかの余計な手口があります。

ユニオンを使用するための最良のガイドは、「UBを呼び出さないとうまく使用することはほとんど不可能なので、しないでください」です。これはVariantには当てはまりませんので、お勧めするのはもっと安全です。

+3

「UB」と「POD」とは何ですか? – pandoragami

+3

@ user2555139未定義の動作とプレーンな古いデータ(型) – Rapptz