c - 何时使用 union ,何时使用结构

标签 c structure unions

我知道 union 和结构之间的区别。 但是从设计和编码的角度来看,使用 union 而不是结构的各种用例是什么?一是空间优化。使用它们还有更多优势吗?

最佳答案

实际上只有两个主要用途。首先是创建一个受歧视的 union 。这可能就是您所想到的“空间优化”,但还有更多内容。您需要一些额外的数据来了解哪个 union 成员“还活着”(其中包含有效数据),因为编译器不会为您执行此操作。您通常会看到类似在结构内部具有 union 的代码,例如:

struct mixed {
  enum { TYPE_INT, TYPE_FLOAT } type;
  union {
    int    int_value;
    float  float_value;
  } data;
};

当分配给 data.int_value 或 data.float_value 时,您还需要将类型成员设置为适当的枚举值。然后使用混合值的代码可以确定是读取 int_value 还是 float_value。

union 的第二个重要用途是提供一个 API,允许用户以多种方式访问​​相同的数据。这是非常有限的,因为它要求 union 中的所有类型以相同的方式放置在内存中。例如,int 和 float 是完全不同的,将 float 作为整数访问不会给您任何特别有意义的数据。

有关此用例的有用示例,请查看有多少网络 API 将为 IPv4 地址定义 union ,例如:

union ipv4addr {
  unsigned  address;
  char      octets[4];
};

大多数代码只想传递 32 位整数值,但有些代码想要读取各个八位字节(字节)。这一切都可以通过指针转换来实现,但它更容易一些, self 记录更多,因此以这种方式使用 union 会稍微安全一些。

但一般来说,如果您不确定是否需要 union ,您几乎可以肯定不需要 union 。

关于c - 何时使用 union ,何时使用结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7950689/

相关文章:

c - 如何在结构中正确使用指针数组

java - 如何使用二维指针通过 JNA 调用 C 函数?

c - 在标记的联盟上 dispatch

python - 分析回调到 Python 的 C 扩展

c - 全局变量作为函数 C 中的参数

c - 复杂数据类型的 Typedef

c - 结构中的数组

c 如何 union 让你将数据视为一个字节数组

c++ - 为不同返回类型的函数返回函数指针的函数

c - 如何从 Linux 帧缓冲区获取 RGB 像素值?