今天是否有理由使用工会(当我们拥有如此多的可用内存时)?

时间:2017-11-09 16:32:59

标签: c unions

据我了解,工会是一种将内存块用于多种用途的方法。在我们的日子里,有没有理由使用工会,那里的记忆不是问题?

显然,我的问题并不是考虑使用可以在某些小型嵌入式设备上找到的有限硬件。

3 个答案:

答案 0 :(得分:7)

可以说,节省空间是定义联合的副作用。拥有联合的主要原因是在任何给定时间都可以创建只有一个活动成员的结构。

struct StringOrInt {
    enum {String, Int} kind;
    union {
        char *str;
        int num;
    } val;
};

虽然当内存不是问题时,可以说上面的union可以用struct替换,但这会误解代码读者的结构目的,他们会假设两者{可以在某些有效的情况下设置{1}}和str。另一方面,使用num会让代码读者明白,目的是设置unionstr,但不要同时设置它们。

答案 1 :(得分:4)

有理由。我现在看到了代码,它们将它们用作variant类型。

struct my_vartype_t {
    int type;
    union {
        char char_value;
        int int_value;
    };
};

现在基于type,它将使用必要的联合值。这是一个非常简单的例子,但它在许多情况下用于提供紧凑数据关联的代码(我们的意思是不散布不必要的冗余类型而不是变体类型的一种干净方式)。

正如AndrewHenle所提到的,这些是在现实世界 XEventstruct sockaddr中使用联盟的一些示例。

答案 2 :(得分:0)

首先,如果使用它们可以提高性能,那就不必再考虑使用它们了。

除此之外,它们可以用作从内在函数访问变量的一种非常简单的方法(在调试时,因为这样做会对性能造成影响)。