swift -(5) 汇编分析结构体、类的内存布局

一、结构体

在 Swift 标准库中,绝大多数的公开类型都是结构体,而枚举和类只占很小一部分

比如Bool Int Double String Array Dictionary等常见类型都是结构体

①  struct Date {
②         var year: Int
③         var month: Int
④         var day: Int ⑤  }
⑥  var date = Date(year: 2019, month: 6, day: 23)

 所有的结构体都有一个编译器自动生成的初始化器( initializer ,初始化方法、构造器、构造方法)

在第⑥行调用的,可以传入所有成员值,用以初始化所有成员(存储属性,Stored Property

二、结构体的初始化器

编译器会根据情况,可能会为结构体生成多个初始化器,宗旨是:保证所有成员都有初始值

从这列子中可以看出,编译器最终选择什么初始化器和结构体原始定义有没有赋默认值有关,编译器选择的初始化器会保证所有成员都有初始值;

三、这能编译通过么

struct Point {  var x: Int? var y: Int?
}
var p1 = Point(x: 10, y: 10)
var p2 = Point(y: 10)
var p3 = Point(x: 10)
var p4 = Point()

根据编译器初使化饿的本质保证所有成员都有初始值

可选项都有个默认值nil

因此可以编译通过

四、自定义初始化器

注: 一旦在定义结构体时自定义了初始化器,编译器就不会再帮它自动生成其他初始化器

因此下边的代码后边三句会拨错

五、窥探初始化器的本质分析自定义初始化器和编译器会我们生成的初始化器是一样的么

第一句 编译器的初始化qi
struct Point {
var x: Int = 0 var
y: Int = 0
}
var p = Point()第二句  自己的初始化qi
struct Point { 
var x: Int 
var y: Int
init() {  
x = 0 
y = 0}
}
var p = Point()


通过上面的汇编指令可以看出 编译器自己调用的初始化qi和我们自己写的初始化qi其实是一样的

六、结构体占用内存大小

七、

类的定义和结构体类似,但编译器并没有为类自动生成可以传入成员值的初始化器

如何里面的x和y 没有初使值,你调用无参会报错,因为你的对象创建完成后,你里面的x和y成员没有值是不安全的

如果类的所有成员都在定义的时候指定了初始值,编译器会为类生成无参的初始化器;

成员的初始化是在这个初始化器中完成的

八、结构体与类的本质区别

结构体是值类型(枚举也是值类型),类是引用类型(指针类型)

九、值类型 的深拷贝

值类型赋值给var let或者给函数传参,是直接将所有内容拷贝一份

类似于对文件进行copy paste操作,产生了全新的文件副本。属于深拷贝(deep copy 

p2.x = 11 p2.y = 22
// 请问p1.x和p1.y是多少?依然是原来的10和20

十 、值类型的赋值操作

在Swift标准库中,为了提升性能,String Array Dictionary Set采取了Copy On Write的技术比如仅当有“写”操作时,才会真正执行拷贝操作

对于标准库值类型的赋值操作, Swift 能确保最佳性能,所有没必要为了保证最佳性能来避免赋值

 建议 :不需要修改的,尽量定义成let

为了提升性能,String Array Dictionary Set采取了Copy On Write的

var s1 = "Jack" var s2 = s1

如有了这句才会有深拷贝,在之前没有发生写操作,直接就是浅拷贝

s2.append("_Rose")

print(s1) // Jack

print(s2) // Jack_Rose

十一、引用类型的赋值

s2.width = 11  s2.height = 22

// 请问s1.widths1.height是多少 11 22 

十二、堆空间内存占用情况

class Point  {
var x = 11
var test = true 
var y = 22
}
var p = Point()
class_getInstanceSize(type(of: p)) // 40
class_getInstanceSize(Point.self) // 40内存地址的前16字节存的是p的地址,堆空间会检查是不是16的倍数,对空间内存对其是48
根据内存对其 分配40哥字节,内存地址按8对其,实际用到的是16+8+8+3 =33

总结-汇编内存存值总结 5  1.30

内存地址格式为:0x4bdc(%rip) ,一般是全局变量 ,全局区(数据段)

内存地址格式为:-0x78(%rbp) ,一般是局部变量 ,栈空间

内存地址格式为:0x10(%rax) ,一般是堆空间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/32094.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

推荐一个比较好的开源的工作流引擎

由于DeepSeek等AI大模型的出现,工作流模式再次流行起来,低代码甚至零代码就可以实现应用开发,而且有DeepSeek这样的超级AI作为大脑,人人都可以开发自动化工作流。 比如搭建邮件助手工作流,可以自动润色各种邮件内容。…

CarPlanner:用于自动驾驶大规模强化学习的一致性自回归轨迹规划

25年2月来自浙大和菜鸟网络的论文“CarPlanner: Consistent Auto-regressive Trajectory Planning for Large-scale Reinforcement Learning in Autonomous Driving”。 轨迹规划对于自动驾驶至关重要,可确保在复杂环境中安全高效地导航。虽然最近基于学习的方法&a…

Fedora41安装MySQL8.4.4

Fedora41安装MySQL8.4.4 Fedora41用yum仓库安装MySQL8.4.4 笔记250310下载安装启动mysqld服务查看生成的初始密码 , 用初始密码登录登录后,必须修改初始密码才能执行其它操作可选设置降低密码强度要求, 使用简单密码降低 validate_password 组件对密码强度的要求 用SET GLOBAL命…

信息安全意识之安全组织架构图

一、信息安全技术概论1.网络在当今社会中的重要作用2.信息安全的内涵 网络出现前:主要面向数据的安全,对信息的机密性、完整性和可用性的保护,即CIA三元组 网络出现后,还涵盖了面向用户的安全,即鉴别,授权&…

安卓Android与iOS设备管理对比:企业选择指南

目录 一、管理方式差异 Android Enterprise方案包含三种典型模式: Apple MDM方案主要提供两种模式: 二、安全防护能力 Android系统特点: 三、应用管理方案 四、设备选择建议 五、典型场景推荐 需求场景 推荐方案 六、决策建议要点…

linunx ubuntu24.04.02装libfuse2导致无法开机进不了桌面解决办法

osu.appimage运行需要libfuse2 然后我就下了fuse,打了两把第二天无法开机 这样是不能开机的 这样是可以开机的 解决办法一:玩星火商店的osu,好了问题解决 解决办法二: 在这个页面 ctrl alt f2进入tty6 sudo apt install ubuntu-desktop 进…

mysql-8.0.41-winx64 手动安装详细教程(2025版)

mysql-8.0.41-winx64 手动安装详细教程(2025版) 一、下载安装包二、配置环境变量三、安装配置四、启动 MySQL 服务,修改密码 一、下载安装包 安装地址如下: https://dev.mysql.com/downloads/mysql/使用7-zip或其他解压软件&…

wireguard搭配udp2raw部署内网

前言 上一篇写了使用 wireguard 可以非常轻松的进行组网部署,但是如果服务器厂商屏蔽了 udp 端口,那就没法了 针对 udp 被服务器厂商屏蔽的情况,需要使用一款 udp2raw 或 socat 类似的工具,来将 udp 打包成 tcp 进行通信 这里以…

[杂学笔记] TCP和UDP的区别,对http接口解释 , Cookie和Session的区别 ,http和https的区别 , 智能指针 ,断点续传

文章目录 1. TCP和UDP的区别2. 对http接口解释3. Cookie和Session的区别4. http和https的区别5. 智能指针6.断点续传 1. TCP和UDP的区别 tcp的特点: 面向连接,可靠性高,全双工,面向字节流udp特点:无连接,不…

Qt入门笔记

目录 一、前言 二、创建Qt项目 2.1、使用向导创建 2.2、最简单的Qt应用程序 2.2.1、main函数 2.2.2、widget.h文件 2.2.3、widget.cpp文件 2.3、Qt按键Botton 2.3.1、创建一个Botton 2.3.2、信号与槽 2.3.3、按键使用信号与槽的方法 2.4、文件Read与Write-QFile类 2…

Unity辅助工具_头部与svn

Unity调用者按钮增加PlaySideButton using QQu; using UnityEditor; using UnityEngine; [InitializeOnLoad] public class PlaySideButton {static PlaySideButton(){UnityEditorToolbar.RightToolbarGUI.Add(OnRightToolbarGUI);UnityEditorToolbar.LeftToolbarGUI.Add(OnLe…

ubuntu软件

视频软件,大部分的编码都能适应 sudo apt install vlc图片软件 sudo apt install gwenview截图软件 sudo apt install flameshot设置快捷键 flameshot flameshot gui -p /home/cyun/Pictures/flameshot也就是把它保存到一个自定义的路径 菜单更换 sudo apt r…

Spring (十)事务

目录 一 Spring数据库的相关配置: 1 导入包: 2 配置数据库连接信息 3 可以直接使用:DataSource,JdbcTemplate 二 事务管理: 1 事务管理的实现 1.1 开启Spring事务管理 1.2 为指定方法添加事务 2 关键类与接口 2.1 事务拦…

【MySQL_04】数据库基本操作(用户管理--配置文件--远程连接--数据库信息查看、创建、删除)

文章目录 一、MySQL 用户管理1.1 用户管理1.11 mysql.user表详解1.12 添加用户1.13 修改用户权限1.14 删除用户1.15 密码问题 二、MySQL 配置文件2.1 配置文件位置2.2 配置文件结构2.3 常用配置参数 三、MySQL远程连接四、数据库的查看、创建、删除4.1 查看数据库4.2 创建、删除…

Java算术运算符与算术表达式

Java算术运算符包括(加、正号)、-(减、负号)、*(乘)、/(除)、%(求余)、(自增)和--(自减)。它们用于构建算术表…

【网络】HTTP协议、HTTPS协议

HTTP与HTTPS HTTP协议概述 HTTP(超文本传输协议):工作在OSI顶层应用层,用于客户端(浏览器)与服务器之间的通信,B/S模式 无状态:每次请求独立,服务器不保存客户端状态(通过Cookie/Session扩展状态管理)。基于TCP:默认端口80(HTTP)、443(HTTPS),保证可靠传输。请…

Linux 网络:skb 数据管理

文章目录 1. 前言2. skb 数据管理2.1 初始化2.2 数据的插入2.2.1 在头部插入数据2.2.2 在尾部插入数据 2.2 数据的移除 3. 小结 1. 前言 限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。 2. skb 数据管理 数…

考研数学复习之定积分定义求解数列极限(超详细教程)

定积分定义求解数列极限是一种将数列极限问题转化为定积分问题进行求解的方法。这种方法通常适用于那些和式数列极限,其主要思路是将数列的项看作是某个函数在某一点或某一段区间上的取值或某种形式的和,然后利用定积分的性质和计算方法,来求解这类数列的极限。 定积分定义 设函…

Linux-基础开发工具

1.软件包管理器 1.1什么是软件包 • 在Linux下安装软件, ⼀个通常的办法是下载到程序的源代码, 并进⾏编译, 得到可执⾏程序. • 但是这样太⿇烦了, 于是有些⼈把⼀些常⽤的软件提前编译好, 做成软件包(可以理解成windows上 的安装程序)放在⼀个服务器上, 通过包管理器可以很…

【无人机路径规划】基于麻雀搜索算法(SSA)的无人机路径规划(Matlab)

效果一览 代码获取私信博主基于麻雀搜索算法(SSA)的无人机路径规划(Matlab) 一、算法背景与核心思想 麻雀搜索算法(Sparrow Search Algorithm, SSA)是一种受麻雀群体觅食行为启发的元启发式算法&#xff0…