構造体と共用体の理解

構造体(struct)と共用体(union)は、どちらも型の異なる複数のデータメンバーを結合するために使用されますが、メモリの格納方法やデータへのアクセス方法に違いがあります。構造体と共用体の主な違いは次のとおりです。

構造体 (構造体):

メモリ レイアウト: 構造体の各メンバーには独立したメモリ空間が割り当てられ、各メンバーは定義された順序でメモリ内に配置されます。

メモリ フットプリント: 構造体のサイズはそのメンバーのサイズの合計に等しく、位置合わせを維持するために追加のパディング バイトが存在する場合があります。

データの分離: 異なるメンバー間のデータは互いに独立しており、1 つのメンバーを変更しても他のメンバーには影響しません。

使用シナリオ: 構造体は、各メンバーが異なるタイプのデータを格納する、複数の関連データ項目を組み合わせて管理するのに適しています。

共用体(union):

メモリ レイアウト: 共用体のすべてのメンバーは同じメモリ空間を共有し、異なるメンバーの値は同じメモリ位置を使用します。

メモリ使用量: すべてのメンバーが同じメモリを共有するため、共用体のサイズは最大のメンバーのサイズと等しくなります。

データ共有: 異なるメンバーが同じメモリを共有し、1 つのメンバーを変更すると他のメンバーの値に影響を与える可能性があります。

使用シナリオ: ユニオンはさまざまなタイプのデータを格納するのに適しており、さまざまな状況下でアクセスする必要があるのは 1 つのタイプのデータのみです。

ここに例があります

Struct和union的使用。
Struct 狗
{
    
    
Int 白狗;
Int 黑狗;
Int 花狗;
}struct_dog;
这里狗类中,白狗,黑狗,花狗每一种狗都有一个家,都有自己的小窝。
但是共用体就不一样了
union1
{
    
    
Int 白狗1;
Int 黑狗1double 花狗1}struct_dog1;
这里的狗类,只有一个家,一个窝,谁要想住窝就得打架,打赢了把那两个狗杀死他就可住了,可以理解为适者生存。每一次的数据更新这里的狗都会进行打架,把其他两个狗杀死。

率直に言うと、構造体は複数のメンバーの数だけメモリ アドレスを割り当てます。共用体は共用体内の最大のデータ占有率に基づいて割り当てられます。たとえば、先ほどの共用体ドッグ 1 の 2 倍は 8 バイトを占有します。 kennel は 8 バイトです。小さいものではなく、最大のものになります。

皆さんに理解していただけるかわかりませんが、情報交換大歓迎です。

以下のコードを見ることができます

#include <stdio.h>

// 假设共用体中需要保存整数或浮点数
typedef union {
    
    
    struct {
    
    
        int intValue;
        float floatValue;
    } numericData;

    char stringValue[20]; // 用于保存字符串
} ValueUnion;

int main() {
    
    
    ValueUnion value;

    // 设置整数值
    value.numericData.intValue = 42;

    printf("Integer value: %d\n", value.numericData.intValue);

    // 设置浮点数值
    value.numericData.floatValue = 3.14;

    printf("Float value: %.2f\n", value.numericData.floatValue);

    // 设置字符串值
    snprintf(value.stringValue, sizeof(value.stringValue), "Hello, World!");

    printf("String value: %s\n", value.stringValue);
    printf("Float value: %.2f\n", value.numericData.floatValue);
    printf("Integer value: %d\n", value.numericData.intValue);
    return 0;
}

ここに画像の説明を挿入します
ただし、通常は上記のように使用されることはなく、プールに設定されるメモリは大きいものと小さいものではなく、同じサイズです。

#include <stdio.h>
#include<iostream>
// 假设共用体中需要保存整数或浮点数
typedef union {
    
    
    int a;
    int b; // 用于保存字符串
} ValueUnion;

int main() {
    
    
    ValueUnion value;
    value.a = 1;
    value.b = 2;
    std::cout<<value.b<<std::endl;
    return 0;
}

一般的には int a; int b; のように使用されますが、これは実際にはエイリアスを意味します。a の値が変更されると、b の値も変更されます。これは、犬小屋のサイズが同じであり、最後に取得した人がカウントされるためです。なぜなら、2 つの家ほどの大きさだからです。

おすすめ

転載: blog.csdn.net/qq_38156743/article/details/132361961