什么时候执行C联合?
When is a C union performed
如果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
的总体大小。
现在,关于联合和如何访问字段也有一堆复杂的规则,所以在这种情况下,binary
是char
的变体,在binary[0]
和binary[1]
中填充几个字节应该是好的,如果我们例如使用:
联盟x{int;浮动b;
};使用x.a = 0x3f800000;
不能保证cout << x.b << endl;
打印1.0或类似的东西。除了char
的数组(可以是无符号的),所有其他类型都要求您访问最初存储的相同字段,或者它是未定义的行为。因此,在这种情况下,union
只能用于"存储不同类型的数据",但您确实需要以某种方式知道union
的每个实例是哪种数据。当你的结构以某种方式有两种不同的表示时,它仍然是一种节省空间的强大方法。
注意,未定义的行为是不好的,因为它可能看起来工作,然后你改变编译器,改变编译器设置,改变代码本身,或类似的东西,突然,代码的行为不同。
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- C++,系统无法执行指定的程序
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 执行函数时导致崩溃的变量
- 无论条件是否为true,if总是在c++中执行
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 在C++中对T*类型执行std::move的意外行为
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如何在没有信号的情况下从C++执行QML插槽
- 如何确认我的constexpr表达式实际上已经在编译时执行
- C++17中的并行执行策略
- QML按钮点击功能执行顺序
- 程序在执行程序的其余部分之前退出
- 为什么catch中的代码没有被执行
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 将执行、作业和WinAPI相乘
- 对字符数组中的元素执行逐位操作
- 什么时候执行C联合?