联合体与位域

news/2024/11/29 8:54:47/
  • 联合体
    • 定义
    • 特性
    • 例子
    • 优缺点
  • 位域
    • 定义
    • 声明
    • 位域的大小
    • 特性说明
  • 联合体位域
    • 定义
    • 声明

联合体

定义

联合体也叫共用体,由不同的数据类型组成,其变量互斥,存储方式是所有成员共用一个段内存,共同体同一时刻只能保存一个成员的值,如果对新的成员赋值,就会将原来成员的值覆盖掉。

特性

  1. union中,分配内容空间大小,等于占用内存最大的数据类型字节大小
  2. 共享一段内存,成员变量的赋值操作,其他成员变量原有数据将成为脏数据,不可用。

例子

// 联合体的定义
union Teacher {char *name; // 8int age; // 4double height; // 8
};
  1. 验证联合体大小
int main(int argc, const char * argv[]) {@autoreleasepool {// 联合体union Teacher teacher;teacher.name = "AngaoTu";teacher.age = 18;teacher.height = 175.0;NSLog(@"联合体大小 size = %lu", sizeof(teacher));}return 0;
}

打印结果:2022-07-30 15:38:42.149406+0800 联合体+位域[9304:21445471] 联合体大小 size = 8

可证明联合体的大小,是由占用内存最大的数据类型字节大小决定

  1. 验证是否共用同一片地址
int main(int argc, const char * argv[]) {@autoreleasepool {// 联合体union Teacher teacher;teacher.name = "AngaoTu";teacher.age = 18;teacher.height = 175.0;NSLog(@"name 地址 = %p, age 地址 = %p, height 地址 = %p", &teacher.name, &teacher.age, &teacher.height);}return 0;
}

打印结果:2022-07-30 15:43:05.950276+0800 联合体+位域[10267:21450499] name 地址 = 0x7ffeefbff398, age 地址 = 0x7ffeefbff398, height 地址 = 0x7ffeefbff398

可验证联合体中成员变量使用同一个地址

  1. 验证一个成员被赋值,其他成员数据不可用
int main(int argc, const char * argv[]) {@autoreleasepool {// 联合体union Teacher teacher;teacher.name = "AngaoTu";teacher.age = 18;teacher.height = 175.0;}return 0;
}

打印结果:

  1. (Teacher) teacher = (name = “AngaoTu”, age = 16176, height = 2.1220037829711594E-314)
  2. (Teacher) teacher = (name = “”, age = 18, height = 2.1219957998584539E-314)
  3. (Teacher) teacher = (name = “”, age = 0, height = 175)

可验证成员变量的赋值操作,其他成员变量原有数据将成为脏数据,不可用

优缺点

  • 优点:
    • 内存使用更为精细、节省空间
  • 缺点:
    • 不够包容,成员之间会互相影响

位域

定义

有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。 例如在存放一个开关量时,只有 0 和 1 两种状态,用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。

声明

  • 位域的定义和结构体的定义相仿
sturct 位域结构名 {位域列表 // 格式: [类型 位域名:位域长度]
};struct bits {int a: 8;int b: 2;int c: 6;
}

位域的大小

struct bits {char a:2; 
};
// size = 1 struct bits {char a:2; char b:2;
};
// size = 1 struct bits {char a:2; char b:2;char c:4; char d:4;
};
// size = 2struct bits {int a:4;
};
// size = 4 struct bits {int a:4;int b:4;
};
// size = 4struct bits {char a:8; char b:8; char c:8; char d:8; int e:4;
};
// size = 8 
  • 位域的存储同样遵循结构体内存对齐规则
    • 选取该位域结构内声明时的类型中长度最大的类型长度,为对齐方式
    • 具体可参考结构体内存对齐【TODO】

特性说明

  1. 当相邻成员,如果它们的位宽之和小于类型的 sizeof 大小,那么后面的成员紧邻前一个成员存储,直到不能容纳为止;如果它们的位宽之和大于类型的 sizeof 大小,那么后面的成员将从新的存储单元开始,其偏移量为类型大小的整数倍。
  2. 位域的宽度不能超过它所依附的数据类型的长度,成员变量都是有类型的,这个类型限制了成员变量的最大长度,: 后面的数字不能超过这个长度。
  3. 位域可以是无名位域,这时它只用来作填充或调整位置。无名的位域是不能使用的

联合体位域

定义

联合体位域结合起来的数据类型,称为联合体位域

声明

union isa_t {uintptr_t bits;
#if defined(ISA_BITFIELD)struct {ISA_BITFIELD;  // defined in isa.h};Class cls;
};
  • 由于isa_t是一个共用体,所以bitscls共用一块内存空间。
  • bits是一个位域,里面根据不同位定义了数据,节省空间。

http://www.ppmy.cn/news/2494.html

相关文章

[附源码]Python计算机毕业设计SSM基于云数据库的便民民宿租赁系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

m对比PSO,WPA,GWPA以及GWO四种优化算法的优化性能,优化目标函数为10个来自CEC2017的标准测试函数

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 灰狼优化算法(GWO),灵感来自于灰狼.GWO算法模拟了自然界灰狼的领导层级和狩猎机制.四种类型的灰狼,如 α,β,δ,w 被用来模拟领导阶层。此外,还实现了狩猎的三个主要步骤:寻找猎物、包…

Metabase学习教程:权限-5

审核用户和数据 Metabase的审核工具是监视和遵从性的一个基本特性,但它们也可以帮助您充分利用Metabase实例。 审计是商业版本功能,使管理员能够深入了解人们如何使用他们的Metabase实例。 图1。团队成员的审核日志,使管理员可以查看人们如…

外汇天眼:外汇市场上不得不说的两大类庄家!

前一阵子,天眼君跟好友讨论外汇市场上有没有庄家,今天天眼君就跟大家探讨下这个问题。我们都知道股票交易中是有所谓的庄家的,散户必须要猜测庄家的做法,否则很有可能变成待割的韭菜。 而我们常见的对外宣传中,基本上…

微信小程序开发笔记 进阶篇⑥——getPhoneNumber 获取用户手机号码(基础库 2.21.2 之后)

文章目录一、前言二、前端代码wxml三、前端代码js四、后端java五、程序流程六、参考一、前言 大部分微信小程序开发者都会有这样的需求:获取小程序用户的手机号码。但是,因为小程序用户的手机号码属于重要信息,为了安全,所以需要如…

ModuleNotFoundError: No module named ‘System‘解决办法

本人在做python和halcon接口的时候发现程序需要System库&#xff0c;报下面的错误 Traceback (most recent call last): File "D:/Project/pyhalcon/pcbhalcon.py", line 2, in <module> import System ModuleNotFoundError: No module named System Process …

程序员看世界杯

目录 1、世界杯赛事规则 1.1、赛制 1.2、小组赛 1.3、淘汰赛阶段 1.4、1/8决赛 1.5、半决赛 1.6、决赛 2、大力神杯材质 3、看球心德 4、2022大力神杯赢家 1、世界杯赛事规则 1.1、赛制 世界杯一共进行64场&#xff0c;其中分小组赛48场&#xff0c;1/8决赛8场&am…

C语言百日刷题第十二天

前言 今天是刷题第12天&#xff0c;放弃不难&#xff0c;但坚持一定很酷~ 临近期末&#xff0c;刷几套模拟题 C语言百日刷题第十二天前言选择题判断题编程题选择题 1.设a1;b2;c3;d4;则表达式a<b?a:c<d? a:d的结果是____。 A、3 B、1 C、4 D、2 正确选项&#xf…