構造体(struct)と共用体(union)は、どちらも型の異なる複数のデータメンバーを結合するために使用されますが、メモリの格納方法やデータへのアクセス方法に違いがあります。構造体と共用体の主な違いは次のとおりです。
構造体 (構造体):
メモリ レイアウト: 構造体の各メンバーには独立したメモリ空間が割り当てられ、各メンバーは定義された順序でメモリ内に配置されます。
メモリ フットプリント: 構造体のサイズはそのメンバーのサイズの合計に等しく、位置合わせを維持するために追加のパディング バイトが存在する場合があります。
データの分離: 異なるメンバー間のデータは互いに独立しており、1 つのメンバーを変更しても他のメンバーには影響しません。
使用シナリオ: 構造体は、各メンバーが異なるタイプのデータを格納する、複数の関連データ項目を組み合わせて管理するのに適しています。
共用体(union):
メモリ レイアウト: 共用体のすべてのメンバーは同じメモリ空間を共有し、異なるメンバーの値は同じメモリ位置を使用します。
メモリ使用量: すべてのメンバーが同じメモリを共有するため、共用体のサイズは最大のメンバーのサイズと等しくなります。
データ共有: 異なるメンバーが同じメモリを共有し、1 つのメンバーを変更すると他のメンバーの値に影響を与える可能性があります。
使用シナリオ: ユニオンはさまざまなタイプのデータを格納するのに適しており、さまざまな状況下でアクセスする必要があるのは 1 つのタイプのデータのみです。
ここに例があります
Struct和union的使用。
Struct 狗
{
Int 白狗;
Int 黑狗;
Int 花狗;
}struct_dog;
这里狗类中,白狗,黑狗,花狗每一种狗都有一个家,都有自己的小窝。
但是共用体就不一样了
union狗1
{
Int 白狗1;
Int 黑狗1;
double 花狗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 つの家ほどの大きさだからです。