目录
1、位段
位段的好处:
位段 - 节省空间 - 不支持跨平台
其中位段的位是指:二进制位
位段的内存分配 :
1. 位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型
2. 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。
3. 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。
下面介绍下如何计算位段的大小
struct s
{
int a : 2;//2个比特位
int b : 5;//5个比特位
int c : 10;//10个比特位
int d : 30;//30个比特位
};
int main()
{
struct s s;
printf("%d ",sizeof(s));//8个字节
return 0;
}
按照上面占用比特位大小计算 占47个比特位 应该是6个字节 -但实际却是8个字节
以下对存放int为例:
以下对存放char为例:
struct t
{
char a : 3;//3个比特位
char b : 4;//4个比特位
char c : 5;//5个比特位
char d : 4;//4个比特位
};
int main()
{
struct t t = {0};
printf("%d ",sizeof(t));//3
return 0;
}
按照上面占用比特位大小计算 占16个比特位 应该是2个字节 -但实际却是3个字节
位段的跨平台问题 :
1. int 位段被当成有符号数还是无符号数是不确定的。
2. 位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机 器会出问题。
3. 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。
4. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是 舍弃剩余的位还是利用,这是不确定的。
总结:
跟结构相比,位段可以达到同样的效果,但是可以很好的节省空间,但是有跨平台的问题存在。
2、枚举
枚举 define都可以定义常量
enum Sex
{
//枚举的可能取值 - 常量
MALE = 2,
FEMALE = 4,
SECRET = 8//给常量赋初始值 不进行赋初始值 则为0 1 2(不初始化就是上一个加一)
};
int mian()
{
enum Sex s = MALE;
return 0;
}
3、联合体
定义:
union Un
{
char c;
int i;
};
int main()
{
nuion Un u;
printf("%d",sizeof(u));//4
return 0;
}
联合体大小计算:
union Un
{
char arr[5];//5个1
int i;//4
};
最小为对齐数的整数倍 最大对齐数位4 但是如果为4 则放不下arr 所以为8