当前位置:网站首页>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;
}
好了,以上就为位段的知识点了,大家觉得有用的话,点个一键三连吧
边栏推荐
猜你喜欢

task06 PyTorch生态

简单做份西红柿炒蛋778

【转载】CMake 语法 - 详解 CMakeLists.txt

flaks framework learning: adding variables to the URL

Keras与tensorflow 使用基础

吃瓜教程task04 第5章 神经网络

【网站小白】Hibernate插入数据成功,不报错,但是数据库中没有值

(一)性能实时监控平台搭建(Grafana+Influxdb+Jmeter)

(二)Docker安装Redis实战(持久化AOF和RDB快照)

(2) Docker installs Redis in practice (persistent AOF and RDB snapshots)
随机推荐
RK3399上的Tengine实践笔记
吃瓜教程task01 第2章 模型评估与选择
task04 Pytorch进阶训练技巧
Difference between @Resource and @Autowired
第13章 类的继承-1
手推卷积神经网络参数(卷积核)求导
【Redis】Redis 的安装及图形化界面 Redis DeskTop Manager 的安装与使用
(一)性能实时监控平台搭建(Grafana+Influxdb+Jmeter)
性能效率测试
【win10+cuda7.5+cudnn6.0安装caffe①】安装cuda和cudnn
信息学奥赛
win下clion打包的.exe文件在无运行环境的电脑运行显示缺失各种.dll
Flask框架学习:模板渲染与Get,Post请求
Summary: Cross Validation
Markdown 常用到的一些编写技巧
课堂练习--0708
QtDataVisualization 数据3D可视化
面试宝典一: code题目记录
字符与字符串
(3) Construction of a real-time performance monitoring platform (Grafana+Prometheus+Node_explorer+Jmeter)