主动已经是我对热爱东西表达的极限了
- 什么是结构体(
struct
)?
结构体
是C语言中一种重要的数据类型,该数据类型由一组称为成员(或称为域,或称为元素)的不同数据组成,其中每个成员可以具有不同的类型。结构体通常用来表示类型不同但是又相关的若干数据。
- 什么是联合体(
union
)?
- 联合体中可以定义多个成员,联合体的大小由最大的成员大小决定
- 联合体的成员公用一个内存,一次只能使用一个成员
- 对某一个成员赋值,会覆盖其他成员的值
- 存储效率更高,可读性更强,可以提高代码的可读性,可以使用位运算提高数据的存储效率
- 联合体(
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
有默认值
结构体内存计算原理及规则请参考:结构体内存计算