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

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

一、认识联合体

1、什么是联合体

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

2、联合体的两个特性

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

3、验证联合体特性

在这里插入图片描述

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

二、认识位域

1、什么是位域

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

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

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

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

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

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

② 由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说 不能超过 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
};
综上例子分析:位域在本质上就是一种结构类型,不过其成员是按二进位分配的。

3、关于位域的总结

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

位运算符只有逻辑运算和移位运算两类。位运算符可以与赋值符一起组成复合赋值符。 如&=,|=,^=,>>=,<<=等。

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

三、联合体位域

  • 了解了上面的联合体、位域,下面看看联合体位域。其实,联合体位域就是联合体和位域组合成的结构。
union Isa {
    Class cls;
    struct Bits {
        int a : 2;
        int b : 4;
        int c : 4;
    }bits;
};
以上示例中,即是联合体位域的一种结构。
联合体Isa中的cls和bits只能有一个是有值,从而节省了空间,而bits又是位域,能存储很多数据,节省空间,所以联合体位域能够大大的节省空间。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yongtao_vip

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值