c语言还支持零碎的一些 自定义数据类型,比如位段,联合等。
位段
在https://blog.csdn.net/weixin_41143631/article/details/81781261
一文中我讲述了结构体节省空间和提高效率的存储成员变量的方式,这一方式同样适用于C++中的class,结构体struct和类class都会经常涉及函数栈帧的压栈问题,对内存处理的打磨会积少成多地去影响运行。
而位段在对数据作用域控制的情况下,能更好地提升效率。
位段的成员名后边有⼀个冒号和⼀个数字,数字为整数,指定位段占用的位(bit)的数目。
struct AB
{
int _a : 12;
int _b : 5;
int _c : 10;
int _d : 30;
};
int aaa = sizeof(struct AB);
12+5+10小于32位,d占30位,总共占8个字节。
在《c和指针》中指出了位段的一个独特使用地方,操作系统,磁盘控制器通信,设备控制器等常常包含几个寄存器,每个寄存器包含虚度包装在一起的整形值,使用位段去存储这些值,可以说完美利用了每一个字节。
譬如,告诉控制器,从哪一个扇区的磁道开始读取。
1. 位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型
2. 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的⽅式来开辟的。
3. 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使⽤位段。
枚举
枚举顾名思义就是⼀⼀列举,把可能的取值⼀⼀列举。
enum关键字,
{}中的内容是枚举类型的可能取值,也叫 枚举常量 。这些可能取值都是有值的,默认从0开始,
⼀次递增1,当然在定义的时候也可以赋初值
enum sex
{
man,
woman,
unknow
};
int bob =man;
枚举的优点:
1. 增加代码的可读性和可维护性
2. 很#define定义的标识符⽐较枚举有类型检查,更加严谨。
3. 防⽌了命名污染(封装)
4. 便于调试
5. 使⽤⽅便,⼀次可以定义多个常量
联合
联合(union)变量的所有成员共享同片存储区/内存。联合变量只能保存它的某一个成员的值。 这些成员共用一块空间。
union 型数据所占的空间等于其最大的成员所占的空间。对 union 型的成员的存取都是相对于该联合体基地址的偏移量为 0 处开始,也就是联合体的访问不论对哪个变量的存取都是从 union 的首地址位置开始。