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)中是各变量是“
互斥”的,所有成员占用同一段内存,修改一个成员会影响其余所有成员
— 缺点: 就是不够“包容”;
- 优点: 是内存使用更为
精细灵活,也节省了内存空间