联合对变量有何帮助?

How union is helpful over a variable?

我已经研究了这个 post 并探索了 union 的用例。每个消息来源都说它的内存效率高于结构,我理解这一点。

但是当你说:

"Union 的变量共享同一个内存,当你改变一个变量的值时,其他的值也会改变,并且一次只能访问一个变量"

那么为什么需要声明union和它的子变量,为什么我不能通过分配最大内存作为union最大变量来使用1个简单变量?

考虑这个例子:

union {
   int length;
   int breadth;
   char status;
} dimension;

Versus

int dimension;  # Now this can store the highest value similar to length and breadth.

我想当你不清楚变量的类型时,我们使用union。

我在将assemble语言转换为c代码时使用了union。有时一个变量用作 int 变量,有时用作指针。这个时候我用了union.

union {
  int data;
  void* handle;
}

希望对您的理解有所帮助。

So why is there a need to declare union and its child variables, why can not I use 1 simple variable by allocating the biggest memory as union biggest variable?

你可以做到这一点,但工会会让事情变得容易得多。

您的特定示例没有多大意义,主要是因为您有两个相同类型,但也因为它们都是整数。因此,让我们以您链接的 post 为例:

union {
  int i;
  float f;
} u;

这意味着当您想将内存视为 int 时可以使用 u.i,如果您想将其视为浮点数 float 则可以使用 u.f

假设您想在没有联合的情况下解决这个问题,只需声明一个“足够大”的变量。你选择哪种类型? int 至少是 16 位,float 至少是 32 位。那么我们挑一个float呢?不,因为在目标系统上,int 可能是 64 位,而 float 是 32 位。所以让我们做一些过度的事情并选择存在的最大类型?好吧,你可以,但是这样就违背了节省内存的目的。

如果声明为变量,我们如何将它们作为不同类型访问?考虑这段代码:

float x;
int y = *(int*) x;

应该很好用吧?不,除了大小可能不同的问题外,您还会 运行 遇到表示问题。有许多不同的方式来表示整数和浮点数。您可能还会遇到字节序问题。

您可以模仿联合的行为而无需实际使用它们,但这将需要大量额外的工作。生成的代码很可能包含很多错误,并且可能会慢得多并且可移植性也差。

一个用例是实现多态性。这是一个非常简单的例子,老实说,它看起来并没有让事情变得更容易,但例子通常都是这样。假设我们有这个:

void print_float(float f)
{
    printf("Value: %f\n", f);
}

void print_int(int i)
{
    printf("Value: %d\n", i);
}

可以替换为:

struct multitype {
    union {
        int i;
        float f;
    } data;
    enum { INT, FLOAT } type;
};

void print(struct multitype x)
{
    switch(x.type) {
    case INT:     printf("Value: %d\n", x.data.i); break;
    case FLOAT:   printf("Value: %f\n", x.data.f); break;
    }
}