有什么好的例子可以说明结构体和联合体的区别吗? 基本上我知道struct使用了它成员的所有内存,而union使用了最大的成员内存空间。还有其他操作系统级别的差异吗?
当前回答
有什么好的例子可以说明“结构体”和“联合体”之间的区别吗?
一种假想的通信协议
struct packetheader {
int sourceaddress;
int destaddress;
int messagetype;
union request {
char fourcc[4];
int requestnumber;
};
};
在这个假想的协议中,已经指定了基于“消息类型”的消息头中的下面位置要么是请求号,要么是四个字符的代码,但不是两者都是。简而言之,联合允许相同的存储位置表示多个数据类型,可以保证您在任何时候只希望存储其中一种类型的数据。
联合在很大程度上是基于C作为系统编程语言的传统的低级细节,其中“重叠”存储位置有时以这种方式使用。如果数据结构一次只保存几种类型中的一种,则有时可以使用联合来节省内存。
一般来说,操作系统不关心或不知道结构体和并体——它们都只是内存块。struct是存储多个数据对象的内存块,这些对象不重叠。联合是存储多个数据对象的内存块,但只能存储其中最大的一个,因此在任何时候只能存储其中一个数据对象。
其他回答
是的,struct和union之间的主要区别和你说的一样。 Struct使用其成员的所有内存,union使用最大的成员内存空间。
但所有的区别在于使用内存的需要。 在unix的进程中可以看到联合的最佳使用,在那里我们使用信号。 比如一个进程一次只能作用于一个信号。 所以一般声明是:
union SIGSELECT
{
SIGNAL_1 signal1;
SIGNAL_2 signal2;
.....
};
在这种情况下,进程只使用所有信号中最高的内存。 但如果在这种情况下使用struct,内存使用量将是所有信号的总和。 有很大的不同。
总之,如果您知道一次访问任何一个成员,则应该选择Union。
结构分配其中所有元素的总大小。
一个联合只分配它最大的成员所需要的内存。
当我们需要对具有一组独立属性的事物进行建模时,建议使用结构;当一个实体具有多种形式且一次只能以一种形式存在时,建议使用联合。
让我们看看它们可以应用的两个地方
您需要存储和更新汽车的值。为了做到这一点,我们需要记录汽车的所有属性,如型号、里程、价格和燃料类型。这些值总是存在于一辆车中,它们不依赖于其他值。 因此,我们需要一种数据类型,它不仅存储所有属性,而且还确保它们的正确更新。这种类型的任务可以使用结构来完成。
struct car{
char model[];
int mileage;
int price;
char fuel_type[];
};
组织需要从大量客户那里收集您的数据以进行付款验证。现在,为了数据完整性和客户安全,一个组织被指示从一个人那里获得最少的详细信息。 这些详细信息可以是您的PAN号码或帐户号码或选民身份证。现在,因为我们需要收集这些细节中的任何一个,同时也要节省内存,我们可以在这里使用联合。它将只保存提供给它的单个值。
union verification_details{
char account_number[10];
char PAN[10];
char voter_id[10];
};
我发现下面的文章解释得很好:结构和联合的区别
“union”和“struct”是C语言的构造。谈论它们之间的“操作系统级别”差异是不合适的,因为如果您使用一个或另一个关键字,则是编译器产生不同的代码。
有什么好的例子可以说明结构体和联合体的区别吗?
下面是来自嵌入式系统应用的真实例子。它只使用联合,但它清楚地显示了联合的功能。
I2C通信协议的写函数在从传递给它的数组中检索数据时使用联合类型,用于数据存储。
union data
{
uint32_t packet;
uint8_t packetbyte[4];
} txdata;
通过指针传递给write函数的数组包含一个字节大小的元素。在for循环中,这些字节分四个步骤逐一提取,并存储到txdata的各个元素中。packetbyte成员。
循环结束后,txdata。数据包包含4个字节的数据,这些数据被连续存储到txdata联合中。作为通过通信总线发送数据的最后一步,txdata。数据包被写入32位缓冲区,在被写入后,32位缓冲区启动写序列。然后通过txdata重置内容。在next for循环开始执行之前,Packet = 0。
通过这种方式,I2C主机可以重新传输32位数据包,直到发送通过的输入数据并终止写入功能。