ユニオンはいつ使われるのでしょうか? C のみの時代の名残でしょうか? 質問する

ユニオンはいつ使われるのでしょうか? C のみの時代の名残でしょうか? 質問する

ユニオンについては学んだことはありますが、よく理解していません。私が読んだ C や C++ のテキストでは、ユニオンが紹介されていますが (時にはさらっと)、ユニオンを使用する理由や場所についての実用的な例はほとんど示されていません。ユニオンは、最新の (または従来の) ケースでどのようなときに役立つのでしょうか。私の推測では、作業スペースが非常に限られているマイクロプロセッサをプログラミングする場合、または API (または同様のもの) を開発していて、エンド ユーザーが一度に複数のオブジェクト/型のインスタンスを 1 つだけ持つようにする場合の 2 つだけです。この 2 つの推測は、正しいのでしょうか。

ベストアンサー1

ユニオンは通常、識別子(ユニオンのどのフィールドが有効かを示す変数)と一緒に使用されます。たとえば、独自の識別子を作成したいとします。変異体タイプ:

struct my_variant_t {
    int type;
    union {
        char char_value;
        short short_value;
        int int_value;
        long long_value;
        float float_value;
        double double_value;
        void* ptr_value;
    };
};

次のように使用します。

/* construct a new float variant instance */
void init_float(struct my_variant_t* v, float initial_value) {
    v->type = VAR_FLOAT;
    v->float_value = initial_value;
}

/* Increments the value of the variant by the given int */
void inc_variant_by_int(struct my_variant_t* v, int n) {
    switch (v->type) {
    case VAR_FLOAT:
        v->float_value += n;
        break;

    case VAR_INT:
        v->int_value += n;
        break;
    ...
    }
}

これは実際には、特に Visual Basic 内部では非常に一般的な慣用句です。

実際の例についてはSDLのSDL_Event ユニオン. (実際のソースコードはこちら)typeユニオンの先頭にフィールドがあり、同じフィールドがすべての SDL_*Event 構造体で繰り返されます。次に、正しいイベントを処理するには、フィールドの値を確認する必要がありますtype

利点は単純です。不要なメモリを使用せずに、すべてのイベント タイプを処理できる単一のデータ型が存在します。

おすすめ記事