内存分析
结构体 类 值类型 引用类型
一: 汇编发展

二: 汇编语言种类

三: 常见指令

四: 寄存器

五: mov lea q是单位 8个bit

六: liulldb常见指令

七: 枚举赋值内存分析


八: 结构体
1 定义结构体
立即数大概等同于字面量
截屏2022-04-14 上午10.42.37.png
// 定义结构体
struct Date {
var year: Int // 不设置默认值是可以的
var month: Int
var day: Int
}
var date = Date(year: 2001, month: 01, day: 01)
print (date.year)
print (date.month)
print (date.day)
// 结构体会自动生成个初始化器
2 结构体设置初始化值
不管设置不设置结构体初始化值, 初始化时候必须保证所有值都初始化,否则编译报错

3 结构体设置可选类型 空也是默认类型
截屏2022-04-14 上午10.46.31.png
4 自定义初始化器
你自己定义了, 就覆盖了系统的, 只能调用自己的
截屏2022-04-14 上午10.48.37.png
5 结构体内存分析
截屏2022-04-14 上午10.54.16.png
// x.y各自占用8个字节
截屏2022-04-14 上午10.55.31.png
// x,y各自占用8个字节, bool占用一个 合计17个, 系统会有内存对齐8位,补齐所以是24个
重点: 结构体初始化必须保证全部成员初始化完毕,类也如此
九: 类
1 初始化器, 不同于结构体, 类不会自动生成可以添加成员变量的初始化器
截屏2022-04-14 上午11.00.18.png
2 初始化类
1 类需要给所有变量指定默认值 **重要
2 成员变量初始化完毕,会生产()初始化器
3 类初始化时候, 务必保证所有成员变量初始化完毕
截屏2022-04-14 上午11.02.20.png
3 结构体和类的本质区别
1 结构体值类型, 赋值是内容拷贝
2 类引用类型, 赋值是指针拷贝
截屏2022-04-14 下午1.32.48.png
分析:
1 函数地址存放在栈空间
2 point 值类型, 指针地址,内容地址都存放在栈空间
3 size 引用类型, 指针地址存放在栈空间,内容地址存放在堆空间
问题, 结构体存在哪? 看定义在哪?
1 定义在函数内: 栈空间
2 定义在类中: 堆空间
3 外面定义: 数据段
九: 值类型 引用类型
1值类型
值类型: 内容拷贝, 新旧变量修改, 不互相影响
截屏2022-04-14 下午1.38.50.png
值类型赋值
编译器优化, 如果没有修改操作 s1 s2指针指向的内容地址, 可能是同一块区域
截屏2022-04-14 下午1.41.37.png
截屏2022-04-14 下午1.43.52.png
2 引用类型
引用类型, 指针拷贝, 新变量修改会影响原变量的值
截屏2022-04-14 下午1.44.52.png
引用变量赋值
截屏2022-04-14 下午1.46.40.png
值类型& 引用类型 let
截屏2022-04-15 下午5.39.37.png
1 p: 属于值类型, 成员变量存放在结构体内部, 结构体占用16个字节, 包含成员变量的内存, p声明let所以, 所以p的指向的内存地址不能修改, p = Point(x:11, y:22) // 不能修改 x, y存放在结构体内部, p指向的内存不能修改, 所以 x, y也不能修改
2 s属于引用类型s占用8个字节, 声明let所以s指针指向的内存地址不能修改, 但是width, height不存在s内部, 所以可以修改
3 字符串, 数组都属于值类型, 定义let内存地址不能被修改
网友评论