OC底层原理 结构体&联合体

主动已经是我对热爱东西表达的极限了

  • 什么是结构体(struct)?

结构体是C语言中一种重要的数据类型,该数据类型由一组称为成员(或称为域,或称为元素)的不同数据组成,其中每个成员可以具有不同的类型。结构体通常用来表示类型不同但是又相关的若干数据。

  • 什么是联合体(union)?
  1. 联合体中可以定义多个成员,联合体的大小由最大的成员大小决定
  2. 联合体的成员公用一个内存,一次只能使用一个成员
  3. 对某一个成员赋值,会覆盖其他成员的值
  4. 存储效率更高,可读性更强,可以提高代码的可读性,可以使用位运算提高数据的存储效率
  5. 联合体(union)也称之为共同体

联合体代码定义如下:

union  {
    char a;
    short b;
    int c;
    float d;
    double e;
};
  • 结构体(struct)与联合体(union)区别:

结构体struct
优点:存储容量较大,包容性强,且成员之间不会相互影响(占用不同内存
缺点:变量共存的,不管是否使用,都会开辟内存,极大的浪费了内存空间

联合体(union)
缺点:每个变量是互斥的,且包容性差
优点:所有成员共用一段内存,使内存的使用更为精细灵活,同时也节省了内存空间

联合体位域定义如下:

  @interface LGCar(){
      // 联合体
      union {
          char bits;
          // 位域
          struct { // 0000 1111
              char front  : 1;
              char back   : 1;
              char left   : 1;
              char right  : 1;
          };
        } _direction;
  }
  @end
  @implementation LGCar

  - (instancetype)init
  {
      self = [super init];
      if (self) {
          _direction.bits = 0b0000000000;
      }
      return self;
  }

  - (void)setFront:(BOOL)isFront {
    
      if (isFront) {
          _direction.bits |= LGDirectionFrontMask;
        } else {
            _direction.bits |= ~LGDirectionFrontMask;
      }
      NSLog(@"%s",__func__);
  }

  - (BOOL)isFront{
      return _direction.front;
  }

 - (void)setBack:(BOOL)isBack {
      _direction.back = isBack;

      NSLog(@"%s",__func__);
  }  

  - (BOOL)isBack{
      return _direction.back;
  }

  @end

从联合体定义可以看出bits_direction存在互斥
bits初始化时,_direction无默认值
_direction初始化时,bits有默认值

结构体内存计算原理及规则请参考:结构体内存计算

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。