1.位域的概念
在程序中,某些信息存储时不需要一个完整的字节,只需要几位,为节省存储空间C语言支持“位域”的结构体。具体说就是,将一个字节分为几个段,每一段表示一个对象,这样一个字节就可以表示多个对象。
2.位域的定义
位域定义与结构定义相仿,其形式为:
struct 位域结构名
{
位域列表 /* 其中位域列表的形式为: 类型说明符 位域名:位域长度 */
};
例如:
struct bs
{
};
位域变量的说明与结构变量说明的方式相同。 可采用先定义后说明,同时定义说明或者直接说明这三种方式。
3.位域的存储说明(32位,VC环境)
*整个结构体的总大小为最宽基本类型成员大小的整数倍
如果st 为位域结构体实例,则sizeof(st)的长度为st中位域列表内最长的类型的整数倍。即st实际存储35位,位域列表内最长类型为int(4bytes),则sizeof(st)=8。
a.如果结构体内相邻邻域字段的类型相同,且位数之和小于该字段类型的长度(sizeof),则后面的字段依次存储。
例如
# include <iostream>
# include <string>
using namespace std;
struct s_bits
{
int i1:8;
int i2:5;
int i3:12;
};
void main()
{
s_bits s1;
cout<<sizeof(s1)<<endl;
system("pause");
}
输出为:4
实际为:8+5+12位
b.如果结构体内相邻邻域字段的类型相同,但位数之和大于该字段类型的长度(sizeof),下一个字段应该从下一个类型长度单元开始存储。
例如:
# include <iostream>
# include <string>
using namespace std;
struct s_bits
{
int i1:20;
int i2:15;
int i3:12;
};
void main()
{
s_bits s1;
cout<<sizeof(s1)<<endl;
system("pause");
}
输出为:8
实际为:4*8+15+12位
c.如果结构体内相邻邻域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式(不同位域字段存放在不同的位域类型字节中),Dev-C++和GCC都采取压缩方式。 对VC来说下一位域按照较大的类型长度偏移开始存储。
# include <iostream>
# include <string>
using namespace std;
struct s_bits
{
int i1:8;
int i2:5;
char c1:6;
short s1:4;
short s2:15;
};
void main()
{
s_bits s1;
cout<<sizeof(s1)<<endl;
system("pause");
}
输出为:12
实际为:4*8+2*8+2*8+2*8
d.如果位域字段之间穿插着非位域字段,则不进行压缩;
d.如果位域字段之间穿插着非位域字段,则不进行压缩;
参考:
1.http://blog.sina.com.cn/s/blog_3d8529400100istl.html#cmt_2350310