3

共用体は私が考えているものに最適であり、特に私のコードが本当に異種のマシンのファミリー、特に低電力のマシンで実行されるべきだと考えるとき、私を悩ませているのは、コンパイラを作成する人々がは、優れたユニオン サポートの導入と提供についてあまり気にしていないようです。たとえば、この表は、無制限のユニオンサポートに関しては事実上空であり、これは私のプロジェクトにとって本当に不快な見方です。

union少なくとも同じプロパティを模倣できる代替手段はありますか?

4

3 に答える 3

9

ユニオンはほとんどのコンパイラで十分にサポートされていますが、十分にサポートされていないのは、非自明なコンストラクタ (無制限のユニオン) を持つメンバーを含むユニオンです。実際には、共用体を作成するときはほとんど常にカスタム コンストラクターが必要になるため、無制限の共用体がないことは不便です。

または、最大のメンバーに十分なサイズを持つ malloc されたメモリを指す void ポインターをいつでも使用できます。欠点は、明示的な型キャストが必要になることです。

于 2012-11-25T18:21:21.333 に答える
5

ユニオンに代わる人気のあるものの1つは、Boost.Variantです。

その中で使用するタイプは、コピー構築可能である必要があります。

更新: C++17でstd::variantが導入されました。その要件はBoost.Variantに基づいています。C++17の機能を考慮して最新化されています。C ++ 98コンパイラ(Boostなど)と互換性があるというオーバーヘッドはありません。標準ライブラリが無料で付属しています。可能な場合は、ユニオンの代わりに使用することをお勧めします。

于 2012-11-25T18:09:30.763 に答える
3

明示的なキャストを使用して、本質的に同じことをいつでも実行できます。

struct YourUnion {
    char x[the size of your largest object];
    A &field1() { return *(A*)&x[0]; }
    int &field2() { return *(int*)&x[0]; }
};

YourUnion y;
new(&y.field1()) A(); // construct A
y.field1().~A(); // destruct A
y.field2() = 1;
// ...

(これは、Boost.Variant などと比較してゼロ オーバーヘッドです。)

編集:より労働組合に似ており、テンプレートはありません。

于 2012-11-25T18:12:16.737 に答える