联合体和位域

联合体和位域

在上一篇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')

测试结果表明,他只存储了我们最后赋值的值,和我们打印他的内存大小结果相印证。其他的赋值结果都被丢弃了。

你可能感兴趣的:(联合体和位域)