联合对变量有何帮助?
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;
}
}
我已经研究了这个 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;
}
}