什么时候执行C联合?

When is a C union performed

本文关键字:联合 执行 什么时候      更新时间:2023-10-16

如果C语言中的联合用于将变量打包成如下类型的字节数组:

typedef union 
{ 
uint16_t integer; 
byte binary[4]; 
} binaryInteger;

什么时候执行实际的并集?当变量被赋值给联合的任何部分时。还是当那个部分被访问时?

当前或以前的赋值(取决于何时执行)是否可以在不导致联合执行的情况下以任何方式访问?

在C和c++中,联合是被动的,所以从技术上讲,它们永远不会被"执行"。它们告诉编译器你想如何为联合类型控制的类型做内存布局。

编译器在编译时计算union的大小(即其最大成员的大小)。然后,当您对union的成员进行赋值时,就会在内存中放置数据。

我不明白你说的执行联合是什么意思。

当您将数据放入其中一个字段时,该数据将被放入内存。然后,访问另一个字段,读取具有相应字段解释的相同数据。

例如,问题中的联合占用4个字节。前2个字节也映射到整型。

+----+----+----+----+
|    |    |    |    | raw bytes
+----+----+----+----+
|    |    |           integer
+----+----+

如果将"0x1234"的值代入整数,则数组的前两个字节分别设置为"0x12"answers"0x34"。(顺序取决于系统的端序)

OTOH,如果设置了bytes[0]和/或bytes[1],会立即影响integer的值

你的问题不能真正回答,因为联合实际上并没有"执行"。

当你用机器语言写程序时,你所拥有的只是一堆字节,然后你告诉计算机如何处理这些字节。可以是"将此地址后面的4个字节视为有符号整数并对其加5"或其他任何内容。

像C这样的高级语言保留了关于特定字节的数据类型的信息,使事情变得更容易(例如,你可以只说myVar = 5,而不必说assign4ByteSignedInteger(myVar,5))。当C语言被编译成真正的机器语言时,它会自动为你给的类型选择正确的机器指令,例如给一个局部变量。

通常,这很好,你想要方便。联合是一种语法糖,在您知道某一串字节有两种用途的情况下,它可以让您有选择地打破这种"类型安全网"。在设计时,联合是为程序员准备的。对计算机来说,它们还不如不存在。

所以联合不是操作,它们只是类型指令。就像你不能说"什么时候int被执行"一样,你也不能对union说同样的话。

从技术上讲,编译器只会将两个不同的字段(在本例中)放在同一个地址。最大的成员(在本例中为4字节的数组)决定union的总体大小。

现在,关于联合和如何访问字段也有一堆复杂的规则,所以在这种情况下,binarychar的变体,在binary[0]binary[1]中填充几个字节应该是好的,如果我们例如使用:

联盟x{int;浮动b;

};

使用x.a = 0x3f800000;不能保证cout << x.b << endl;打印1.0或类似的东西。除了char的数组(可以是无符号的),所有其他类型都要求您访问最初存储的相同字段,或者它是未定义的行为。因此,在这种情况下,union只能用于"存储不同类型的数据",但您确实需要以某种方式知道union的每个实例是哪种数据。当你的结构以某种方式有两种不同的表示时,它仍然是一种节省空间的强大方法。

注意,未定义的行为是不好的,因为它可能看起来工作,然后你改变编译器,改变编译器设置,改变代码本身,或类似的东西,突然,代码的行为不同。