为什么UNION适合C中的低级系统编程?

为什么UNION适合C中的低级系统编程?,c,unions,C,Unions,在一本关于C语言的教科书中,我读到当涉及到低级系统编程时,联合是非常有用的。我想知道为什么会这样 为什么联合是低级系统编程的好选择?联合和结构是两种不同的结构。说一个比另一个好是胡说八道 菠萝比游泳哲学更好吗?unions允许您选择不同类型的菠萝,但在任何时候都只能使用其中一种。例如,如果您处于受约束的环境中,那么这可能会很有用 另一方面,struct将为其内部的所有类型保留内存,这意味着您正在使用更多内存,尽管您现在可以使用struct中的所有变量 这一个肯定比另一个好,我不知道这是一个正确的

在一本关于C语言的教科书中,我读到当涉及到低级系统编程时,联合是非常有用的。我想知道为什么会这样


为什么联合是低级系统编程的好选择?

联合和结构是两种不同的结构。说一个比另一个好是胡说八道


菠萝比游泳哲学更好吗?

unions允许您选择不同类型的菠萝,但在任何时候都只能使用其中一种。例如,如果您处于受约束的环境中,那么这可能会很有用

另一方面,
struct
将为其内部的所有类型保留内存,这意味着您正在使用更多内存,尽管您现在可以使用
struct
中的所有变量


这一个肯定比另一个好,我不知道这是一个正确的说法。它们有两个不同的用途。

工会和结构都在不同的情况下用于不同的用途。!你永远不能用联合来代替结构,反之亦然
为了更好地理解,请清楚了解structure&union的规范

对于您遇到的每个
union
,您可能会遇到10-100个
struct
s

这两个(
struct
s和
union
s)是相关的,但它们做不同的工作。当您需要在不同的时间在单个空间单位中存储不同的值时,可以使用并集来节省空间。结构更为普遍有用;它收集了大量需要一起存储和访问(并且不能共享空间)的值

是的,
union
在低级编程中很有用。同样,can
struct
。两者都不比另一个好,因为他们做不同的工作。当需要
结构时,不能使用
联合
。不使用
union
也可以生存下来,但当它们有用时,
union
非常有用


如果在只能使用一个或另一个之间进行选择,我会选择每次都可以使用
struct

这是错误的-您不能更改联合的结构。区别在于内存使用情况。在结构中,所有变量在内存中的位置都是分开的。所以结构的大小是它的变量之和(通常是+填充)


另一方面,联合和它们最大的变量一样大,所有变量都位于内存中的一个位置,因此修改一个变量会改变联合中其他变量的内容。

好吧,你的教科书应该解释它的意思——我们只能猜测其意图

然而,我在os驱动程序等中看到的一个用途是将设备的硬件寄存器映射到多个视图。因此,如果一个IO设备有一个由一个字表示的IO地址,您可能需要寻址整个字或高阶字节等

虽然您可以使用指针并强制转换它们,但更清晰的方法是使用

  union {
      unsigned short word;
      struct {
           unsigned char high;
           unsigned char low;
      } byte;
   };
现在,它允许通过
byte.high
等对整个
字或部分字进行寻址


然而,union并不是struct的替代品或替代品——它们有不同的用途——其中一个目的可能是对同一内存有不同的看法。

如前所述:
union
struct
没有相同的用途

如果要执行字节操作,则联合非常有用,例如:

union {
   int i;
   char pi[4];
}

您可以轻松访问变量
i
的某些字节,而无需执行困难的强制转换,这在低级编程中非常常见。

AFAIK联合和结构有不同的用途,因此您将苹果与橘子进行比较。。。除非你用“更好”来描述作者的意思。更好的目的是什么?用哪种尺度更好?这一论断是如此广泛,以至于任何理智的人都不会说它是真的。“非常有用”的意思与“更好”完全不同。为什么这不是一个真正的问题?好吧,让我来纠正这个问题。这实际上是一个意见问题。我认为,
联合
是一种可怕的构造,它鼓励对所有形式的类型安全进行回避。这并不是说它没有立足之地,但是,在我看来,通常有更好的方法来获得你想要的东西。如果菠萝漂浮在水面上,它们显然会更好……好吧@mouviciel,但为什么只有工会才适合低层系统编程。撇开这个比较不谈。低层系统编程需要工会和结构的混合。以TCP/IP协议栈为例,我希望他不会仅仅在定义中用
struct
替换
union
。我将问题理解为使用单个
结构
类型与类型的
联合
。@Jeff我也希望这不是OP要做的,否则他会有一个问题:联合不在这里是为了节省内存。你什么也救不了。。这就像说一个指向内存位置的指针可以节省内存,因为你可以在一个内存位置保存不同的东西。我问了一个非常具体的问题!!“C深入”和他们提到的like union在低级编程中很有用。他们给出了一个例子,说明如何使用union查找机器字节顺序。“在那里,他们正努力寻找工会的用途;一般来说,这不是联合的一个重要用途。如果你想进行位运算,结构是有用的。两者对于低级系统编程都很有用。+1是结构和联合的混合示例,表明两者都同样有用。@mouviciel:尽管很少有
union
不使用
struct
作为成员类型之一(直接或间接)。