联合体和位域
在上一篇iOS中关于内存对齐的探究中,我们探索了结构体内存对齐的情况,这部分继续探索一下位域和联合体union
位域
我们先来看位域,在结构体中
struct Car1 {
BOOL front; //1
BOOL back ; //1
BOOL left ; //1
BOOL right; //1 //4字节
}car1;
这样一个结构体所占空间是4字节。我们在想一个布尔值
在二进制中,用0或1
一位就能表示,那这样将大大节约了内存空间。由此我们引出了位域
struct Car1 {
BOOL front: 1;
BOOL back : 1;
BOOL left : 1;
BOOL right: 1; //不超过8位,只占用1个字节。
}car1;
这样的结构体,所占内存空间只有1个字节了。当然我们也可以在后面自定义所占空间,也可以占用更多的空间。
联合体
我们先定义如下联合体
union un2{
double a; //8
int b; //4
char c; //1
char d; //1
};
我们先打印一下sizeof()
2021-06-11 09:45:53.206451+0800 KCObjcBuild[87220:3314559] sizeof = 8
我们把联合体的内容再改变一下,这次去掉8字节的double
类型
union un2{
int b; //4
char c; //1
char d; //2
};
再来打印一下sizeof()
2021-06-11 09:48:49.336502+0800 KCObjcBuild[87246:3316473]sizeof = 4
说明他里面只保留一个最大成员的内存地址,来存储数据。并没有开辟多个内存地址,来存储所有的数据。我们可以给联合体赋值,看看会打印什么
union un2 persion ;
persion.c = 'o';
persion.b = 4;
persion.a = 10.00;
打印结果如下:
(un2) persion = (a = 10, b = 0, c = '\0', d = '\0')
测试结果表明,他只存储了我们最后赋值的值,和我们打印他的内存大小结果相印证。其他的赋值结果都被丢弃了。
网友评论