联合体union的每一位表示一个信息叫做联合体位域
联合体
联合体也叫共用体,由不同的数据类型组成,其变量互斥,存储方式是所有成员共用一个段内存,共同体同一时刻只能保存一个成员的值,如果对新的成员赋值,就会将原来成员的值覆盖掉。
结构体
结构体是把不同的数据组合存储成一个整体,存储方式是所有成员组合存储,每个成员都分别占用一个内存。
联合体与结构体的区别
- 内存占用情况
- 结构体的各个成员会占用不同的内存,互相之间没有影响
- 共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员
- 内存分配大小
- 结构体内存 >= 所有成员占用的内存总和(成员之间可能会有缝隙)
- 共用体占用的内存等于最大的成员占用的内存
优缺点:
优点:
- 节省空间
- 位运算可以提高数据操作的效率
缺点:
- 包容性弱,成员之间会相互影响
简单使用
需求: 需要记录一个车子的行驶方向,
分析:
- 前后左右这四个方向如果分别使用bool值来存储,那么需要4个字节,总共是32个位
- 这四个方向是互斥的,也就是一个时刻只能存储一个方位,所以可以用联合体来表示
- 每一个值放在一个位上面,所以是4位,也就是0.5个字节(当然最少也是1个字节),就比之前省了好多空间
定义属性
定义联合体
解释:
- union表示定义了一个联合体
- char bits是我们真正使用的那一段内存的表示。就是成员
- 这里联合体的内存是一个char表示的字节
- struct {}说明这个字节可以用来表示什么,每个类型用哪一位来表示
- front代表第一个位置,back代表第二个位置
- 后面的1表示占用1位
- 如果back写的是2,则为0001 1111
- 这个是联合体的名称
联合体的运算
先定义位运算的计算方式
说明:
- 如果是向前,则将1左移0位,也就是0000 0001
- 如果是向后,则将1左移1位,也就是0000 0010
- 如果是向左,则将1左移2位,也就是0000 0100
- 如果是向右,则将1左移3位,也就是0000 1000
进行位运算设置(用向前来举例)
说明:
- |=,是取非运算符,都为0时为0,否则为1
- LGDirectionFrontMask为0000 0001,所以可以将bits的其他位数都设置为0,只保留最后一位为1
- 这样就可以让他代表向前
使用
说明:
- 可以通过LLDB来查看此时的位数上为0或1