大家好,下面小编给大家分享一下。很多人还不知道c++位域(什么是位深度)。下面是详细的解释。现在让我们来看看!
深度c理解位域(by fylxaut)有些信息在存储时不需要占用一个完整的字节,只需要占用几个或一个二进制位即可。比如存储一个开关,只有0和1两种状态,可以用二进制的一位。为了节省存储空间空和使处理简单,C语言还提供了一种叫做“位域”或“位段”的数据结构。所谓“位域”,就是把一个字节中的二进制分成几个不同的区域,并说明每个区域的位数。每个域都有一个域名,允许在程序中通过域名进行操作。这样,几个不同的对象可以用一个字节的二进制位域来表示。
一、位域的定义及位域变量的解释位域的定义类似于结构的定义,其形式为:结构化位域结构名。
{位域列表};
位域列表的形式是:类型描述符位域名:位域长度。
例如:
结构bs
{
int a:8;
int b:2;
int c:6;
};
//////////////////////////////////////////////////////////////////////////////////////////////////////
结构foo1 {
int a:1;
int:2;/空域
短c:1;
};
在foo结构的定义中,成员A的类型虽然是int,但在四个字节中只占了一位的空;比如B占用了第一个int的2 bit空之间,但是B占用的是第一个int的2 bit空之间还是第二个int的2 bit空之间?这里实际上涉及到如何用‘位域’对齐结构。我们来分析一下。
结构foo2 {
char a:2;
,char b:3;
char c:1;
};
结构foo3 {
char a:2;
char b:3;
char c:7;
};
显然,这不是我们所期望的。如果按照正常的内存对齐规则,这两个结构的大小应该是3,那是什么问题呢?首先,通过这个现象,我们可以确定,带有‘位域’的结构并不是按照每个域对齐的,而是将一些位域成员‘绑’在一起进行对齐。
1)以foo2为例,该结构中所有成员均为char类型,三个bit字段占用的合计空为6 bit < 8 bit(1字节)。这时编译器会将这三个成员‘绑定’在一起进行比对,并且以空的最小代价进行间作,这也是我们得到Sizeof (struct)的原因。
2)看foo3的结构。和foo2一样,三个成员类型都是char类型,但是三个成员位字段之和是9 bit > 8 bit(1字节),其中位字段不能跨越两个成员基本类型空。此时,编译器根据char '绑定'两个成员A和B。而C是单独和char类型对齐的,所以B和C之间其实有空的差距,但也是空之间最经济的方法。让我们来看一个结构定义:
结构foo4 {
char a:2;
char b:3;
int c:1;
};
,在foo4中,虽然三个bit字段占用的空之和是6 bit < 8 bit(1字节),但是因为char和int的对齐系数不同,所以不能绑在一起。是不是A和B绑在一起按照char对齐,C单独按照int对齐?
c++位域(什么是位深度)在上面解释过了。本文到此结束。希望能帮到大家。如果信息有误,请联系边肖进行更正。
相关导读:c++ 位域(什么叫位深度)
相关内容:c++ 位域(什么叫位深度)