【C/C++】你知道位段吗?段位?不,是位段!
创始人
2024-04-08 03:29:29

本章重点

什么是位段?

位段的内存分配

位段的跨平台问题

位段的应用


上一篇文章我详细介绍了第一种自定义类型--结构体。本章节我们认识一下另外一种自定义类型--

位段。因为讲解位段时需要用到一点结构体的知识,所以我直接把链接放到这里可按需直接跳转:

结构体&内存对齐http://t.csdn.cn/mUXIXOK,进入正题,我们一起来学习如何用结构体实现位段。

什么是位段?


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

1.位段的成员必须是 int、unsigned int 或signed int 等整型家族。 2.位段的成员名后边有一个冒号和一个数字
比如: 这是我们已经认识的结构体类型:
struct S
{int a;int b;int c;int d;
};
这是一个位段类型:
struct A
{int a : 2;int b : 5;int c : 10;int d : 30;
};

位段的样子看起来奇奇怪怪的,那个冒号和后面的数字是什么意思呢?

位段位段,它名字里的“位”就是二进制位。

冒号和后面的数字其实是它的成员变量在告诉编译器:

成员a:我只需要2个比特的空间足以!

成员b:请给我分配5个比特的空间吧!

成员c:给我来10个!

成员d:我需要的空间大,给我来40个比特的空间吧!

每个成员都得到了自己想要的大小的空间,那么位段A的总大小是多少呢?

我们用sizeof来计算一下:

#include
int main()
{printf("结构体S的大小为:  %d字节\n", sizeof(struct S));printf("位段A的大小为:     %d字节\n", sizeof(struct A));return 0;
}

结果如下:

学完上一章之后,我们很轻松的计算出结构体S的大小4*4=16字节与结果一致。

再看位段,把成员们所需要的空间大小加起来2+5+10+30=47比特。

已知1字节=8比特。换算一下位段A的总大小应该是6字节就够了,可结果却是8字节。

那我们就不得不研究一下位段是如何进行内存分配的。

位段的内存分配


1. 位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型 2. 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。 3. 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段
首先声明:位段有很多用法是标准未定义的,也就是说不同的机器上或者不同的编译器上内存如何 分配都有所差异,所以一下内容中有关内存分配的插图并不是严格正确的!!! 举个例子: 这是一个成员是int类型的位段:
struct A
{int a : 2;int b : 5;int c : 10;int d : 30;
};

这是一个成员是char类型的位段:

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

 现在假定义一个位段的变量并进行初始化:

struct S
{char a : 3;char b : 4;char c : 5;char d : 4;
};
struct S s = { 0 };
s.a = 10;
s.b = 12;
s.c = 3;
s.d = 4;

其在vs2013环境下是这样进行存储数据的:

说明:数据是以二进制的方式进行存储的。

再次强调:以上的存储形式仅仅是vs2013环境下的,每种不同的编译器在不同的环境下都有自己存储的方式 。

正因为如此,位段的使用被种种原因所限制。下面就看看位段的跨平台问题。

位段的跨平台问题


1. int 位段被当成有符号数还是无符号数是不确定的。 说明:例如一个整型存储的时候,它的最高位是有符号位还是无符号位是有明确的规定的, 而位段标准并没有规定。有的平台会当作有符号数处理,有的反之。
2. 位段中最大位的数目不能确定。 说明:16位机器最大16,32位机器最大32,写成27,在16位机器会出问题。
3. 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。 说明: 例如:
4. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时, 是舍弃剩余的位还是利用,这是不确定的。 说明: 例如这种情况:

总结

跟结构相比,位段可以达到同样的效果,但是可以很好的节省空间,但是有跨平台的问题存在。

位段的应用


位段的有点就是可以根据自己需求来开辟一定大小的空间,在一定程度上做到了节省空间。

假设有这样的场景:

现在需要存储一个零件的规格:

长、宽、高、颜色、生产日期、价格

如果用结构体的话,即使全部用char类型来表示,也需要5个字节的空间。

但是用位段的话,某些数据,有可能用2个比特位就足够描述所有的情况。

这样有很好的避免了非必要的空间浪费。

总而言之,灵活的使用位段,能使我们的程序得到优化。

本章完!

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...