当前位置:网站首页>C语言结构体——位段概念的讲解

C语言结构体——位段概念的讲解

2022-08-11 05:16:00 云逸943

前言

        之前我对结构体内存分配的方式、对默认对齐数的指令修改做了详细的博客讲解,(C语言结构体详解 (2) 结构体内存对齐,默认对齐数,大家有兴趣的话可以去了解了解这方面的知识。

        

一. 什么是位段?

位段的声明和结构是类似的,有两个不同:

1.位段的成员必须是 int、unsigned int 或signed int 。

2.位段的成员名后边有一个冒号和一个数字,每个数字代表了各个成员变量在结构体中所占的内存大小,数字的单位是bit位。

struct D{
    int _a:2;
    int _b:5;
    int _c:10;
    int _d:30;
};

 

        如上图代码,struct D就是位段类型的结构体,请大家猜一下,这个结构体的大小又占多少字节?

        我们按照字面上的意思来判断,有四个整型变量,每个整型变量所对应的大小分别为2bit,5bit,10bit,30bit位,那么四个成员变量一共占47bit位空间。通过调试代码可知,答案为:

         

 struct D位段类型的结果为8字节,接下来,我就来给大家分析一下8字节是怎样算出来的。

解析:位段如何开辟?因为结构体中成员变量都是整型,所以位段每一次开辟空间时,都是4字节,4字节的开辟。

           a占2位,b占5位,c占10位,共占17bit位,位段刚开始开辟的内存空间有4字节,32bit位,剩下的空间为15bit位(32-17)。
        15bit位的空间并不能存放下成员d的30bit位,所以还得开辟一次4字节空间,所以结果为8字节。

        结论:在位段存储的过程中,第一次开辟的空间剩余的15Bit位被浪费掉,第二次开辟的空间里,浪费了剩下的2bit位。

          这就是使用位段类型的好处,若是没有位段,四个整型变量就会在结构体中开辟4*4=16字节(128bit位) 的空间,而使用了位段,四个整型变量可以控制内存空间,只占8字节(64bit位);有人会问了,47bit位,还得要8字节才能存放下。我们要理解:位段只能是在一定程度上节省了空间,它并不能绝对的节省空间,要知足常乐。位段可以严格的控制每个变量所占内存,极大的节省了空间的使用效率,让各变量都能完美明确的分工。

二.位段的内存分配

1.位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型

2. 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。

3. 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。

举个例子:

struct S
{
 char a:3;
 char b:4;
 char c:5;
 char d:4;
};

int main(){
struct S s = {0};
s.a = 10;
s.b = 12;
s.c = 3;
s.d = 4;

    return 0;

}

 

 

好了,以上就为位段的知识点了,大家觉得有用的话,点个一键三连吧 

 

原网站

版权声明
本文为[云逸943]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_69283129/article/details/126106836