文章目录
- 结构体实现位段
- 联合体的创建和访问
- 联合体在内存中的存储
- 枚举常量的创建和访问
前言
结构体在描述一些复杂对象的某一种特性时,比如人的性别,性别只有 男 女 保密三种情况,如果我们用 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