结构体如何节省空间(位段的定义) 枚举常量 联合体 创建和访问。。。。。。


文章目录

  • 结构体实现位段
  • 联合体的创建和访问
  • 联合体在内存中的存储
  • 枚举常量的创建和访问


前言

结构体在描述一些复杂对象的某一种特性时,比如人的性别,性别只有 男 女  保密三种情况,如果我们用 00代表男 01代表女 10代表保密,那么描述这三种情况我们只需要两个bit位,但是我们在定义结构体时,如果需要用数字来表示一些不同的情况,我们通常会直接定义一个int类型的变量,这样的话会浪费30个字节的空间。为了可以最大化的利用空间,一种依附结构体类型的位段就诞生了


一 结构体实现位段

1:什么是位段

声明于结构体类型,但是有两点不同。

(1):位段的成员必须是 int 或者 unsigned int 或者  signed int。(当然char类型的也可以,char也是属于整形家族的)

(2):在定义时位段的成员后面有一个冒号 数字  

那么冒号和数字分别代表者什么呢?????

下面是一个简单的位段的定义和分析。

struct A
{
    int a : 3;//代表a只占3个bit位
    int b : 4;//代表b只占4个bit位
    int c : 5;//代表c只占5个bit位
    int d : 4;//代表d只占4个bit位
};

因为这个位段第一个变量是int类型的,所以系统会直接给他一个整形的大小,32个bit位。而定义的这四个变量,总共只占了16个bit位,这个结构体的大小也只有四个字节,达到了节省空间的作用。

位段的内存是如何分配的呢????

我们先将创建的位段进行一下初始化, 

通过定义a占三个bit位,b占四个bit位,c占五个bit位 ,d占四个bit位。在赋值时应该是如下的情况:(因为总共只占了两个字节的大小,所以我只画出了16个bit位)

那么我们通过调试,可以在监视内查看一下数据的存储是不是像我们预计的那样

 可以看到,结果确实是像我们预计的那样。

当然这种情况只是单独在vs编译器中,在其他的不同编译器里,实现的过程可能不一样,所以位段一般不能实现跨平台。

二.联合体的创建和访问 

什么是联合体呢????

联合体也是一种特殊的自定义类型,这种类型定义的变量也包含一系列的成员,特征是这些成员公用一块空间(空间是最大的某一变量的空间)

 通过这个例子我们可以一般的看出联合体的一些特性了。

联合体的在内存中的各种变量放置情况如下:

 那么这个联合体有什么作用呢????

判断编译器的大小端存储

 大端存储:高位数据存储在低地址,低位数据存储在高地址

小端存储:高位数据存储在高高地址,低位数据存储在低地址

(2)联合体大小的计算 

(1):联合体的大小至少是最大成员的大小

(2):联合体的最终大小必须是最大对齐数的整数倍(这一条和结构体类似,只是没有内存对齐)

 注意这里用的是vs编译器,vs的默认对齐数为8.最大对齐数在我的上一篇博客有详细介绍

(39条消息) 结构体 保姆级教程 。。看完包会。结构体声明,创建和访问,结构体的自引用,结构体的内存对齐, 修改编译器的默认对齐数。_来年秋风起^的博客-CSDN博客

最后要注意的是:联合体的许多成员变量,同一时间只能使用一个成员。 

三:枚举(一一列举的)常量

定义如下:

enum colc
{
    b,c,d
};//注意枚举在创建时,里面的常量是用逗号隔开。

那么他代表什么呢????

我们直接编译可以看到,不赋初值时他们分别代表0 1 2 

当然我们也可以给他赋初值

可以看到,没有被赋初值的b依旧为0,而c 被赋初值后 d也变成了9 

这就是枚举常量的一个特点

后面数据的值是前面数据的值加1

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值