1. 联合体union
当多个数据需要共享内存
或者多个数据每次只取其一
时,可以利用联合体(union)
描述
-
联合体是一个
结构
; -
它的所有成员相对于基地址的
偏移量都为0
; -
此结构空间要大到足够
容纳最"宽"的成员
;
2. 位域
2.1 目的:
主要目的是为了节省存储空间
,并使处理简便
。
有些信息在存储时,并不需要占用一个完整的字节
, 而只需占几个或一个二进制位
。
例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。
2.2 定义
C语言提供的了一种数据结构
,称为“位域
”或“位段
”。
把一个字节中的二进位划分为几个不同的区域
,并说明每个区域的位数
。
2.3 域名和无位域名
每个域有一个域名
,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。
位域可以无位域名
,这时它只用来作填充
或调整位置
。无名的位域是不能使用
的。
2.4 规则
-
如果相邻位域字段的
类型相同
,且其位宽之和小于类型的sizeof大小
,则后面的字段将紧邻前一个字段
存储,直到不能容纳为止; -
如果相邻位域字段的
类型相同
,但其位宽之和大于类型的sizeof大小
,则后面的字段将从新的存储单元
开始,其偏移量为其类型大小的整数倍; -
如果相邻的位域字段的
类型不同
,则各编译器的具体实现有差异,VC6采取不压缩方式,Dev-C++采取压缩方式; -
如果位域字段之间穿
插着非位域字段
,则不进行压缩
; -
结构体总大小为
最大对齐数
的整数倍
。
union u8 {
unsigned char whole;
struct {
unsigned char bit0:1;
unsigned char bit1:1;
unsigned char bit2:1;
unsigned char bit3:1;
unsigned char bit4:1;
unsigned char bit5:1;
unsigned char :1; // 占位
unsigned char bit7:1;
}bits;
u8() {
whole = 0x00;//整体赋值
whole.bit0 = 0;//单独位赋值
}
};
3. 与结构体的比较
- 结构体
结构体(struct)中所有变量是“
共存
”的,各个成员会占用不同的内存,互相之间没有影响
— 优点:“有容乃大”, 全面
;
- 缺点:struct内存空间的分配是粗放的,不管用不用,
全分配
。
- 联合体
联合体(union)中是各变量是“
互斥
”的,所有成员占用同一段内存,修改一个成员会影响其余所有成员
— 缺点: 就是不够“包容”;
- 优点: 是内存使用更为
精细灵活
,也节省了内存
空间