C - ユニオンとは何ですか? Union と Struct は非常に似ていますが、違いは何ですか? なぜ労働組合を作るのか?どこで使用する必要がありますか?

C言語には変数と呼ばれる変数がありunion、さまざまな状況でさまざまな型やサイズのオブジェクトを格納するために使用されます。これは struct に非常に似ていますstruct。struct は 1 つ以上の変数のコレクションです。

Union の宣言方法は非常に簡単で、struct次のように Union の宣言方法とまったく同じです。

union u_tag {
    
    
    int ival;
    char *sval;
} u;

ご覧のとおり、唯一の違いは構造のstruct変更ですunion

使用方法はまったく同じです。

//一般变量
union_name.val
//指针
union_pointer->val

この2つはとても似ていますが、この2つの違いは何でしょうか? 言い換えれば、なぜ同じようなものを 2 つ入手したいのでしょうか? C は C++ ではなく、一部の関数は異なるグループによって開発されており、一部の関数は重複します。

1つ目は表面的な違いで、使用目的とは全く異なりますが、struct括弧内のすべての変数を同時に格納するわけではないようです。unionunionstruct

union u_tag {
    
    
    int a;
    int b;
} u;

int main()
{
    
    
    u.a=1;
    u.b=2;
    printf("u_tag: %d\n", u.a);
    return 0;
}

出力結果は次のようになります。

u_tag: 2

構造体のように前の出力unionに基づいていないため、ここでの結果は間違っていません。格納できるデータは 1 種類だけであるため、後者は元の格納値を上書きします。u.a=11u.b=2u

したがって、union内部的に宣言された変数は、実際のオブジェクトやメンバー変数ではなく、可能性として理解できます

また、union内部には値が 1 つしかないため、通常は同じデータ型は使用されません。現在どのようなデータ型が含まれているかについては、プログラマがプログラミングする際に注意する必要があるものです一般的には、変数を使用しu_type、次に、現在含まれている型を判定ステートメントで判定します。

しかしstruct、それはunionコアとは異なり、unionその誕生の理由は、スペースを割り当てるメカニズムです。

sizeof()以下の2つのデータのサイズを測定すると、

union u_tag {
    
    
    int ival;
    float fval;
    char *sval;
} u;

struct s_tag {
    
    
    int ival;
    float fval;
    char *sval;
} s;

u_tagのサイズは 8 バイトですが、 のs_tagサイズは 16 バイトであることがわかります。これは、union内部的に宣言されたデータ型に対して最大のスペースを残しておきstructながら。

現在のほとんどのマシンでは、intタイプは 4 バイト、floatタイプは 4 バイト、cahr *タイプは 8 バイトです。したがってu、これは 8 バイトの最大のスペースを占有し、sそれぞれに独自のスペース (4+4+8=16 バイト) があります。

では、いつ使用する必要があるのでしょうかunion?
まず、ある種のデータを保存するという特性により、浮動小数点数と整数の切り替えなど、一般的な計算を行うために使用できます。
第二に、上記の使用目的の下では、スペースの節約になります。この場合、構造体も使用できますが、上記の 3 つのデータ型のサイズが 2 倍のみである状況が適切であると考えられます。メモリ アドレス割り当てメカニズムにより、一部の種類のデータのアドレスが特別に必要になります (たとえば、一部のマシンではint偶数桁のアドレスが必要です)。

以下は例ですが、整数アドレス制限は偶数ではなく、4 の倍数です。

struct s_tag {
    
    
    int ival;
    char a;
} s;

この構造体のサイズは 8 バイトです。このサイズかどうかを自分で試してみてください。

そして、コンパイラはシーケンシャルに読み取るので、次のように書くと、

struct s_tag {
    
    
    int a;
    char b;
    int c;
    char d;
} s;

この場合、この構造体のサイズは 16 バイトになります。この場合、次のように、同じタイプのデータをまとめて書き込むことで、スペースを節約できます。

struct s_tag {
    
    
    int a;
    int c;
    char b;
    char d;
} s;

このように、この構造体が占めるスペースは 12 バイトです。使用した場合union、サイズは順序に関係なく常に 4 バイトになります。データ型の可能性が増えるにつれて、スペースを節約する必要性が明らかになります。

困っている方のお役に立てれば幸いです~

おすすめ

転載: blog.csdn.net/qq_33919450/article/details/130613405