iOS-4.联合体位域

876 阅读2分钟

ios底层文章汇总

1. 联合体union

多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union)

描述

  1. 联合体是一个结构

  2. 它的所有成员相对于基地址的偏移量都为0

  3. 此结构空间要大到足够容纳最"宽"的成员

2. 位域

2.1 目的:

主要目的是为了节省存储空间,并使处理简便

有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位

例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。

2.2 定义

C语言提供的了一种数据结构,称为“位域”或“位段”。

把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数

2.3 域名和无位域名

每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。

位域可以无位域名,这时它只用来作填充调整位置。无名的位域是不能使用的。

2.4 规则

  1. 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;

  2. 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;

  3. 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式,Dev-C++采取压缩方式;

  4. 如果位域字段之间穿插着非位域字段,则不进行压缩

  5. 结构体总大小为最大对齐数整数倍

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)中是各变量是“互斥”的,所有成员占用同一段内存,修改一个成员会影响其余所有成员

— 缺点: 就是不够“包容”;

  • 优点: 是内存使用更为精细灵活,也节省了内存空间