gpt4 book ai didi

c - 当可以使用 struct - C 完成相同的事情时使用 union 的优点

转载 作者:太空狗 更新时间:2023-10-29 17:14:30 25 4
gpt4 key购买 nike

我很难理解 C 语言中 union 的用法。我在这里阅读了很多关于这个主题的帖子。但是他们都没有解释为什么在使用结构可以实现相同的事情时首选 union

引用自 K&R

As an example such as might be found in a compiler symbol table manager, suppose that a constant may be an int, a float, or a character pointer. The value of a particular constant must be stored in a variable of the proper type, yet it is most convenient for table management if the value occupies the same amount of storage and is stored in the same place regardless of its type. This is the purpose of a union a single variable that can legitimately hold any of one of several types. The syntax is based on structures:

union u_tag {
int ival;
float fval;
char *sval;
} u;

用法将是

if (utype == INT)
printf("%d\n", u.ival);
if (utype == FLOAT)
printf("%f\n", u.fval);
if (utype == STRING)
printf("%s\n", u.sval);
else
printf("bad type %d in utype\n", utype);

同样的事情可以使用结构来实现。类似的东西,

struct u_tag {
utype_t utype;
int ival;
float fval;
char *sval;
} u;

if (u.utype == INT)
printf("%d\n", u.ival);
if (u.utype == FLOAT)
printf("%f\n", u.fval);
if (u.utype == STRING)
printf("%s\n", u.sval);
else
printf("bad type %d in utype\n", utype);

这不一样吗? union 有什么优势?

有什么想法吗?

最佳答案

在您发布的示例中,union 的大小将是 float 的大小(假设它是最大的 - 正如评论中指出的那样,它在 64 位编译器中可能会有所不同),而 struct 的大小将是是 float、int、char* 和 utype_t(以及填充,如果有的话)的大小之和。

我的编译器的结果:

union u_tag {
int ival;
float fval;
char *sval;
};
struct s_tag {
int ival;
float fval;
char *sval;
};

int main()
{
printf("%d\n", sizeof(union u_tag)); //prints 4
printf("%d\n", sizeof(struct s_tag)); //prints 12
return 0;
}

关于c - 当可以使用 struct - C 完成相同的事情时使用 union 的优点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3352181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com