OC对象原理探究(下)—— 联合体(共用体)与位域

在开发中,有时候内存和存储空间极其有限的状况下(好比嵌入式等),常规的iOS对象存储方式,对内存的开销就不符合开发要求了,这时候,咱们会采用其余的存储方式:联合体和位域。markdown

1、认识联合体

一、什么是联合体

联合体也叫共用体,是一种特殊的类,也是一种构造类型的数据结构。 在一个联合体内可以定义多种不一样的数据类型。一个被说明为该联合体类型的变量中。赞成装入该联合体所定义的不论什么一种数据。这些数据共享同一段内存,以达到节省空间的目的。数据结构

二、联合体的两个特性

  • ① 在union中,分配内存空间的大小,等于占内存最大的数据类型字节大小。
  • ② 共享同一段内存,成员变量的赋值操做,其余的成员变量原有数据将成为脏数据,不能共存。

三、验证联合体特性

在这里插入图片描述

分析:根据以上demo,UnionTest方法中,按照联合体特性bit的大小应该是8字节(由Double决定的),a和b的地址应该是相同的,而且先给a赋值,再给b赋值,那么b的值会将a的值覆盖。spa

2、认识位域

一、什么是位域

有些信息在存储时,并不须要占用一个完整的字节,而只需占几个或一个二进制位。 例如在存放一个开关量时,只有 0 和 1 两种状态,用一位二进位便可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。—— 引用自[谭浩强老师的《C语言程序设计》]设计

二、位域的定义和使用说明

  • 位域的定义和结构体有些类似,其通常形式为:
struct struct_name { 
	位域列表    //格式为:[类型说明符 位域名:位域长度]
 };
复制代码
  • 例以下面这样定义一个位域:
struct bits {
	int a:8;
	int b:2;
	int c:6;
}data;
复制代码

分析:上述位域,说明 data 为 bits 变量,共占两个字节,16位。其中位域 a 占 8 位,位域 b 占 2 位,位域 c 占 6位。code

  • 注意:对于位域的定义尚有如下几点说明:

① 一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另外一位域时,应从下一单元起存放该位域。也能够有意使某位域从下一单元开始。orm

② 因为位域不容许跨两个字节,所以位域的长度不能大于一个字节的长度,也就是说 不能超过 8 位二进位。对象

③ 位域能够无位域名,这时它只用来做填充或调整位置。无名的位域是不能使用的。图片

struct bits {
	unsigned a:4
	unsigned :0 /*空域*/
	unsigned b:4 /*从下一单元开始存放*/
	unsigned c:4
}
复制代码

以上,a 占第一字节的 4 位,后 4 位填 0 表示不使用,b 从第二字节开始,占用 4 位,c 占用 4 位。内存

struct bits {
	int a:1
	int :2 /*该 2 位不能使用*/
	int b:3
	int c:2
};
复制代码
综上例子分析:位域在本质上就是一种结构类型,不过其成员是按二进位分配的。

三、关于位域的总结

① 位运算是C语言的一种特殊运算功能, 它是以二进制位为单位进行运算的。

位运算符只有逻辑运算和移位运算两类。位运算符能够与赋值符一块儿组成复合赋值符。 如&=,|=,^=,>>=,<<=等。开发

② 利用位运算能够完成汇编语言的某些功能,如置位,位清零,移位等。还可进行数据的压缩存储和并行运算。
③ 位域在本质上也是结构类型,不过它的成员按二进制位分配内存。其定义、说明及使用的方式都与结构相同。
④ 位域提供了一种手段,使得可在高级语言中实现数据的压缩,节省了存储空间,同时也提升了程序的效率。

3、联合体位域

  • 了解了上面的联合体、位域,下面看看联合体位域。其实,联合体位域就是联合体和位域组合成的结构。
union Isa {
    Class cls;
    struct Bits {
        int a : 2;
        int b : 4;
        int c : 4;
    }bits;
};
复制代码
以上示例中,便是联合体位域的一种结构。
联合体Isa中的cls和bits只能有一个是有值,从而节省了空间,而bits又是位域,能存储不少数据,节省空间,因此联合体位域可以大大的节省空间。
相关文章
相关标签/搜索