今天是否有使用联合的理由(当我们有这么多可用内存时)?
Is there a reason for using unions today (when we have so much available memory)?
据我了解,联合是一种将内存块用于多种用途的方法。在我们这个记忆不是问题的时代,是否有理由使用联合?
显然我的问题不涉及使用在一些小型嵌入式设备上可以找到的有限硬件。
这是有原因的。我什至现在已经看到将它们用作 variant
类型的代码。
struct my_vartype_t {
int type;
union {
char char_value;
int int_value;
};
};
现在基于 type
它将使用必要的联合值。这是一个非常简单的示例,但在许多情况下使用它来提供具有紧凑数据关联的代码(我们的意思是不分散不必要的冗余类型,而是一种干净的变体类型方式)。
正如 AndrewHenle 所提到的,这些是在 真实世界 XEvent
, struct sockaddr
.
中使用联合的一些示例
首先,如果使用它们可以提高性能,那么就毫不犹豫地使用它们。
除此之外,它们可以用作从内部函数访问变量的一种非常简单的方法(在调试时,因为显然这样做会降低性能)。
可以说,节省 space 是定义联合的副作用。拥有联合的主要原因是允许在任何给定时间创建只有一个活动成员的结构。
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
.
首先,如果使用它们可以提高性能,那么就毫不犹豫地使用它们。
除此之外,它们可以用作从内部函数访问变量的一种非常简单的方法(在调试时,因为显然这样做会降低性能)。
可以说,节省 space 是定义联合的副作用。拥有联合的主要原因是允许在任何给定时间创建只有一个活动成员的结构。
struct StringOrInt {
enum {String, Int} kind;
union {
char *str;
int num;
} val;
};
虽然有人可能会争辩说,当内存不是问题时,上面的 union
可以替换为 struct
,但这会向代码的读者歪曲结构的目的,他们会认为str
和 num
都可以在某些有效情况下设置。另一方面,使用 union
可以让代码阅读者清楚地知道其意图是设置 str
或 num
,但绝不会同时设置它们。