一. 简单的枚举类型
- 简单枚举
enum TestEnum {
case test1,test2,test3
}
let t = testEnum.test1
print(MemoryLayout<Testenum>.size)// 实际用了 多少 占用一个字节
print(MemoryLayout<Testenum>.stride)//分配了一个字节
print(MemoryLayout<Testenum>.alignment)// 对齐字节
-
调试技巧: 查看变量的内存地址:
创建后 -> 断点 - > 最下面调试窗口 -> 右键 “verw memory of ...” -
这种简单的枚举占用一个字节,可以存储在
0X00~0xFF这个取范围,总共256个,也就是这里可以放256个case。
- 存在原始值的枚举
enum TestEnum: Int{
case test1 = 1,
case test2 = 2,
case test3 = 3
}
-
Int类型 在64位计算机 占用8个字节 - 这种存在原始值的枚举仍然占用1个字节,不影响内存布局
- 存在关联值的枚举类型
enum TestEnum {
case test1(Int,Int,Int)
case test2(Int,Int)
case test3(Int)
case test4(Bool)
case test5
}
var e = TestEnum.test1(1,2,3)
e = .test2(1,2)
e = .test3(1)
e = .test4(true)
e = .test5
print(MemoryLayout<Testenum>.size)//实际占用25个字节
print(MemoryLayout<TestEnum>.stride)//系统给分配32个字节
print(MemoryLayout<TestEnum>.alignment)//内存对齐8个字节
- 这种关联值的枚举关联值放在枚举的内存空间里面
- 底层是关联值跟原始值都存在在其内存里面,前面24个字节存储关联值,最后一个字节存着原始值
- 最后有一个字节存储原始值,表示哪一个枚举值。有N(按照最多的那个枚举占用)个字节存储 关联值
- 只有一个值得枚举值
enum TestEnum {
case test5
}
print(MemoryLayout<Testenum>.size)//实际占用0个字节
print(MemoryLayout<TestEnum>.stride)//系统给分配1个字节
print(MemoryLayout<TestEnum>.alignment)//内存对齐1个字节
- 这种情况 不占用内存
enum TestEnum {
case test(Int)
}
print(MemoryLayout<Testenum>.size)//实际占用8个字节
print(MemoryLayout<TestEnum>.stride)//系统给分配8个字节
print(MemoryLayout<TestEnum>.alignment)//内存对齐8个字节
- 只有一个
case的枚举 存在关联值,不占用内存,区分case
二 . 含有枚举的Switch语句底层的实现
enum TestEnum {
case test1(Int,Int)
case test2(Int)
case test3
}
var t = TEstEnum.test1
switch t {
case .test1(V1,V2):
print(t)
case . test2(V1):
print(t)
case. test3
print(t)
}
- 比较的是 最后一个字节的
case,确定case 。然后进行比较,然后把关联值赋值给switchcase 的变量。
三. 汇编语法基础:
- 调用出汇编调试窗口:打断点->
Dubug->Debug WorkFlow->Always Show diseassembly展示
1.程序的本质:
截屏2020-02-24下午8.42.47.png
截屏2020-02-24下午8.44.11.png
- 寄存器与内存的关系
-
时间运算过程,CPU 会将内存据存到寄存器中,然后在对寄存器中的数据进行运算
*
截屏2020-02-24下午8.49.48.png
-
编程语言的发展
截屏2020-02-24下午8.52.47.png
4.常见的汇编指令
截屏2020-02-24下午8.58.34.png
- 我们使用的** AT&T** 指令
- 注意:
leaq赋值的是计算的内存地址
movq赋值的是计算的 数值 -
jmp跟内存地址,直接跳转到 内存地址所在的指令。 -
callq指令 后面跟函数地址,会跟retqreturn 配合使用,会跳转执行函数,函数执行完成后 回到跳转的地方 继续执行下面指令。 -
r开头的64位寄存器 占用八字节e开头的32位寄存器 占用4字节的 -
ax,bx,cx:16位 2字节 -
alah... : 8位寄存器 1字节
-
lldb的常用指令
截屏2020-02-24下午9.36.40.png
截屏2020-02-24下午9.38.25.png
前面是全称,后面的n(调试高级源码)s(调试高级源码)ni(调试汇编代码)si(调试汇编代码) 常用指令,注意两者区别。
- 获取
rip的地址值:register read rip












网友评论