0

次のように、構造体内の共用体の宣言を見てきました。以下にサンプルコードを示します。

私の質問は、メモリの節約に役立ちますか(ユニオンが使用される典型的な用途)? メリットがわかりません。

typedef struct
{
    int x1;
    unsigned int x2;
    ourstruct1 ov1;
    ourstruct1 ov2;
    union
    {
            struct
            {
                mystruct1 v1;
                mystruct2 v2;
                mystruct3 v3;
                int* ctxSC;
                mystruct4 v4;
                Bool v5;
                Long v6;
                Long v7;
                Long v8;
                Long v9;
            }mystr;
    };
}structvar1;

-広告

4

7 に答える 7

4

これはユニオンの一般的な使用法ではありません。ユニオンはバリアント型です。多くの異なる種類の型をユニオンに入れ、それらを取得できます。型を 1 つだけ共用体に入れると、変な見た目のコード以外は何も得られません。

于 2008-10-30T05:33:49.837 に答える
2

うーん。上記の例は私には少し奇妙に思えます.共用体の通常の理由は、同じストレージへの2つの異なるシンボリックパス(バイト単位、ワード単位など)を持つためです。ただし、指定した例には、ユニオンのメンバーが 1 つしかありません。

私が考えることができる唯一のことは、コードが将来の拡張に目を向けて書かれているということです.IEでは、ユニオンは後続のバージョンで追加のメンバーを持つことになります.

于 2008-10-30T05:32:48.560 に答える
2

Philippeが書いたことに追加するには: Microsoft はこれを DirectX で使用して、そのD3DMATRIX(および派生構造 `D3DXMATRIX) を次のように定義します。

typedef struct _D3DMATRIX {
    union {
        struct {
            float        _11, _12, _13, _14;
            float        _21, _22, _23, _24;
            float        _31, _32, _33, _34;
            float        _41, _42, _43, _44;

        };
        float m[4][4];
    };
} D3DMATRIX;

これにより、名前またはインデックスのいずれかで行列要素をアドレス指定し、行列の最初の行の 2 番目の要素を参照myMat._12できます。最も頭の切れたコンパイラでさえ、定数オフセット計算などへのアクセスを最適化するため、これは実際には単なる構文糖衣です。myMat.m[0][1]myMatmyMat.m[0][1]

于 2008-10-30T18:01:54.400 に答える
0

このコードは有効ですか? ユニオンにフィールドが1つしかないからではなく(奇妙に思えますが)、ユニオンが匿名だからです。内部構造体 mystr で対処したいことをコンパイラーにどのように伝えますか?

 structvar1 var1;
 var1.mystr.ctxSC = NULL;  // compile error : structvar1 has no mystr member

そして、GCC 3.4.4 はこれを無効な ISO C として報告します。

編集: Steve Fallowsがコメントで答えを教えてくれました: これは、シームレスな構造集約を可能にする独自の Microsoft 拡張機能です: 「含まれる」構造のすべてのフィールドは、包含構造の一部であると見なされます。

于 2008-10-30T14:56:30.200 に答える
0

コードを匿名にすることを意図した難読化された変数と型の名前で言うのは難しいですが、それを書いた人が誤って mystr 構造体内のフィールドが結合されることを期待していた可能性はありますか?

于 2008-10-30T06:06:52.843 に答える
0

いいえ、unoin には他のメンバーが含まれている必要がありますが、構造だけでなく、何も問題はありませんが、メモリの最適化を行うことはできません。

于 2008-10-31T05:10:22.350 に答える
0

ここではユニオンは実際には使用されていないように思えます。そのようなユニオン内の単一の構造体も見たことがありません。変。

于 2008-10-30T05:35:40.893 に答える