据我所知,工会是一种将内存块用于多种用途的方法。在我们的日子里,有没有理由使用工会,那里的记忆不是问题?
显然,我的问题并不是考虑使用可以在某些小型嵌入式设备上找到的有限硬件。
可以说,节省空间是定义联合的副作用。拥有联合的主要原因是在任何给定时间都可以创建只有一个活动成员的结构。
struct StringOrInt {
enum {String, Int} kind;
union {
char *str;
int num;
} val;
};
虽然有人可能会争辩说,当记忆不成问题时,上面的union
可以用struct
取代,这会误解代码读者的结构目的,他们会认为str
和num
都可以在某些有效的情况下设置。另一方面,使用union
使代码读者明白,目的是设置str
或num
,但不能同时设置它们。
有理由。我现在已经看过使用它们作为variant
类型的代码。
struct my_vartype_t {
int type;
union {
char char_value;
int int_value;
};
};
现在基于type
它将使用必要的联合值。这是一个非常简单的例子,但它在很多情况下用于提供紧凑数据关联的代码(我们的意思是不散布不必要的冗余类型而不是一种简洁的方式到变体类型)。
正如AndrewHenle所提到的,这些是在现实世界XEvent
,struct sockaddr
中使用工会的一些例子。
首先,如果使用它们可以提高性能,那就不必再考虑使用它们了。
除此之外,它们可以用作从内在函数访问变量的一种非常简单的方法(在调试时,因为这样做会对性能造成损害)。