C语言的Bit fields

C语言给我们提供了几个基本的数据类型,比如char(8位),short(16位),int(32位),long long(64位)。然而实际应用中,这些数据类型的变量一般都不会“存满”,这样从信息存储的效率的角度上讲,这是一种“浪费”。好在C语言在结构体中引入了Bit fields这种数据结构,可以在一定程度上减小结构体的大小,提高内存使用效率。

Bit fields可以指定某个结构体变量所占用的位数(指定的位数必须比小于等于这个变量的数据类型占用的位数),从而达到减少使用空间的目的。

书写格式为:

struct 位域结构名

{

  位域列表

};

其中位域列表的形式为:

 类型说明符 位域名:位域长度;

例如:

struct time{
     int day:5,
      mouth:4,
      year:14;
};

在这里,day这个变量所占用的空间就是5位,mouth是4位,year位14位。

 这里我们假设要通过定义结构体来表示日期,我们来试一下使用Bit fields可以节约多少空间。

因为一个月最多只有31天,所以用5bit就可以表示这个信息。

同理,月数需要4bit,年数(假设四位数,0-9999)需要14bit。

 1 #include <cstdio>
 2 
 3 struct time{
 4     int day:5,
 5     mouth:4,
 6     year:14;
 7 };
 8 struct time2{
 9     int day,
10     mouth,
11     year;
12 };
13 
14 int main()
15 {
16     time now;
17     time2 now2;
18     now.day=3;
19     now.mouth=1;
20     now.year=2016;
21     now2.day=3;
22     now2.mouth=1;
23     now2.year=2016;
24     printf( "%d %d %d\n",now.year,now.mouth,now.day );
25     printf( "%d %d %d\n",now2.year,now2.mouth,now2.day );
26     int structsize=sizeof( now );
27     printf( "the size of struct time is %d\n",structsize );
28     int structsize2=sizeof( now2 );
29     printf( "the size of struct time2 is %d\n",structsize2 );
30     return 0;
31 }

运行结果为

从中可以看出,Bit fields确实可以压缩结构体的大小,这个存储时间信息的结构体便可以压缩到平时(普通int定义)大小的1/3.这在一些算法以及大型软件开发中会有很大用处。

然而。。我通过发现Bit fields定义的不同变量类型的结构体依然还是会遵循内存对齐。。所以Bit fields也就只能对只有相同的结构体变量的结构体起作用了。。

 1 #include <cstdio>
 2 
 3 struct bit{
 4    char x:2;
 5    int y:6;
 6    long long z:10;
 7 };
 8 int main()
 9 {
10     bit t;
11     int structbit=sizeof( t );
12     printf( "the size of struct structbit is %d\n",structbit );
13     return 0;
14 }

运行结果:

这个结构体占用的空间依然是遵循内存对齐的4+4+8=16字节

posted @ 2016-01-03 01:46  KIWI的博客  阅读(1863)  评论(1编辑  收藏  举报