何时进行C联合

Ein*_*ren 1 c c++ compiler-construction unions

如果C中的并集用于将变量打包到字节数组中,如下所述:

typedef union 
{ 
uint16_t integer; 
byte binary[4]; 
} binaryInteger;
Run Code Online (Sandbox Code Playgroud)

什么时候进行实际联合?是否将变量分配给union的任何部分.或者是在访问该部分时?

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

glg*_*lgl 6

我不清楚你说执行联盟是什么意思.

无论何时将数据放入其中一个字段,数据都会被放入内存中.然后,访问另一个字段,您将使用相应字段的解释读取相同的数据.

例如,问题中的联合需要4个字节.前2个字节也映射到整数.

+----+----+----+----+
|    |    |    |    | raw bytes
+----+----+----+----+
|    |    |           integer
+----+----+
Run Code Online (Sandbox Code Playgroud)

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

OTOH,如果你设置bytes[0]和/或bytes[1],你立即影响其价值integer.


das*_*ght 6

在C和C++中,联合是被动的,因此从技术上讲它们永远不会"执行".它们告诉编译器如何为union控制的类型执行内存布局.

编译器在编译时计算union(其最大成员的大小)的大小.然后,当你对你的成员进行分配时,就会在内存中放置数据union.