当前位置:网站首页>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;
}
好了,以上就为位段的知识点了,大家觉得有用的话,点个一键三连吧
边栏推荐
猜你喜欢
Blender 初教程
flaks framework learning: adding variables to the URL
总结:交叉验证
【win10+cuda7.5+cudnn6.0安装caffe②】安装Visual Studio 2013和caffe
(3) Construction of a real-time performance monitoring platform (Grafana+Prometheus+Node_explorer+Jmeter)
【CSDN21天学习挑战赛】第一天,配置环境外加实现mnist手写数字识别
【动态代理】CGLIB 动态代理的使用及原理
吃瓜教程task05 第6章 支持向量机
Django--20 implements Redis support, context, and interaction of context and interface
【备忘】从零开始搭建Yolo5训练环境
随机推荐
【备忘】于仕琪的libfacedetection相关
如何设置pip安装的国内源
【翻译】博客游戏项目Q1K3 – 制作
for循环使用多线程优化
(1) Docker installs Redis in practice (one master, two slaves, three sentinels)
flask框架学习:debug与配置项
信息学奥赛
task06 PyTorch生态
Who am I ?
标准模板题:采药
看完这篇博客之后,含着泪学会了TCP/IP
(三)性能实时监控平台搭建(Grafana+Prometheus+Node_explorer+Jmeter)
tensorflow代码翻译成pytorch代码 -详细教程+案例
Minecraft
Win下安装不同版本的MinGW(g++/gcc)以及对应clion编辑器的配置
原生态mongo连接查询代码
【转载】CMake 语法 - 详解 CMakeLists.txt
吃瓜教程task01 第2章 模型评估与选择
LeetCode1166.设计文件系统
第6章 分支语句和逻辑运算符