*/ --------------------------------------------------------------------------------------
*/ 出自: 快乐编程 http://hi.bccn.net/108519
*/ 作者: neverTheSame E-mail:zhaoxufeng9997@126.com QQ:475818502
*/ 时间: 2008-6-1
*/ 声明: 尊重作者劳动,转载请保留本段文字
*/ --------------------------------------------------------------------------------------
紧凑地使用内存,从位域开始.
说到位域,大家可能有一点陌生.因为初学编程的时侯还少会提到它.
那么,就先介绍一下,C语言为什么要引进位域这个数据结构.
大家都知道,C语言刚出现的时侯,由于内存空间很有限.有的几MB大小,甚至不到1MB.
而在存储一些信息的时侯,有一些信息它所占的空间不足一个字节,而只需要一到二个二进制位
就可以存储.比如:在存储一个数据而这个数据只有二种状态(0,1),我们用一个二进制位就可做到.
如果要存储8个这样的数据状态,只要一个字节的空间就可以存储.当不用二进制来存储的时侯就
需要8个字节来存储.这样,显然很浪费.这也不是我们所愿见到的.
因此,我们的前辈们就想出一个解决它的方法,那就是位域.它就可以很好解决这样的问题.
现在,我们就来更深入地了解位域.
位域又叫位段,是一种特殊的数据结构,用于指定该成员在内存存储时所用到的位数,
从而可以在机内更紧凑的表示数据。
位域的定义形式为:
struct 位域结构名
{ 位域列表 };
其中位域列表的形式为: 类型说明符 位域名:位域长度
比如:
struct BitType
{
unsigned memb1:1;
unsigned short memb2:3;
int memb3:3;
short memb4:1;
};
需要注意的是,位域中成员的类型说明符只能是unsigned(unsigned int),int,unsigned short,short这三种类型.
位域长度就是冒号后面的数字,单位是二进制位.
当我们使用的时侯,就像我们使用结构的成员一样.
如:struct bitType var; var.memb1=1;var.memb2=3;var.memb3=-1;var.memb4=0;
注意在给成员赋值的时侯,需要考虑成员的范围.还有一点,位域的成员的范围不能超过int型的大小.
如果sizeof(int)为2个字节的话,那么成员的说明就不能这样:int memb:17;
否则编译器会报错:Error: Bit field too large in main
还需要多说一点,位域中的各个成员的长度最好为字节的整数倍.这样不会造成空间不可使用.
当知道了位域定义后,我们应该怎样更好地,更有效地,更方便地使用它呢.
要知道,位域的使用会带来处理时间上的增加.因此,我们不能任意地使用它.要在合适的时侯使用,
才能使用空间效率和时间效率两方面综合效率更少.大家可以想一下,有那些情况适合使用位域.
可以说,有很多情况适合使用位域.例如:当要描述的某个实体的状态,而它的状态只有二种情况,
并且需要描述的实体很多.这样使用位域非常合适.而如果不用位域,用char型数据来描述的时侯.
不知道大家有没有过这样的感受:感觉心好痛,好像是在割肉一样,不舍得,很不爽.
如果用了位域,感觉很轻松.
总之,使用位域要用到合适的地方.怎样合适的地方,这可能由程序员的感觉来定.
好吧,就说到这里了.