美文网首页
第四节 分析枚举的内存布局以及常用指令

第四节 分析枚举的内存布局以及常用指令

作者: 天明天 | 来源:发表于2021-01-30 13:59 被阅读0次

一. 简单的枚举类型

  1. 简单枚举
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。

  1. 存在原始值的枚举
enum TestEnum: Int{
 case test1 = 1,
 case test2 = 2,
 case test3 = 3
}
  • Int类型 在64位计算机 占用8个字节
  • 这种存在原始值的枚举仍然占用1个字节,不影响内存布局
  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(按照最多的那个枚举占用)个字节存储 关联值

  1. 只有一个值得枚举值
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 。然后进行比较,然后把关联值赋值给switch case 的变量。

三. 汇编语法基础:

  • 调用出汇编调试窗口:打断点-> Dubug ->Debug WorkFlow ->Always Show diseassembly 展示
    1.程序的本质:
    截屏2020-02-24下午8.42.47.png
截屏2020-02-24下午8.44.11.png
  1. 寄存器与内存的关系
  • 时间运算过程,CPU 会将内存据存到寄存器中,然后在对寄存器中的数据进行运算

    * 截屏2020-02-24下午8.49.48.png
  1. 编程语言的发展


    截屏2020-02-24下午8.52.47.png

    4.常见的汇编指令


    截屏2020-02-24下午8.58.34.png
  • 我们使用的** AT&T** 指令
  • 注意:leaq 赋值的是计算的内存地址
    movq 赋值的是计算的 数值
  • jmp 跟内存地址,直接跳转到 内存地址所在的指令。
  • callq 指令 后面跟函数地址,会跟 retq return 配合使用,会跳转执行函数,函数执行完成后 回到跳转的地方 继续执行下面指令。
  • r开头的64位寄存器 占用八字节 e开头的32位寄存器 占用4字节的
  • axbx ,cx :16位 2字节
  • al ah... : 8位寄存器 1字节
  1. lldb的常用指令
    截屏2020-02-24下午9.36.40.png
    截屏2020-02-24下午9.38.25.png
    前面是全称,后面的 n (调试高级源码)s(调试高级源码) ni(调试汇编代码)si(调试汇编代码) 常用指令,注意两者区别。
  • 获取rip的地址值:register read rip

相关文章

  • 第四节 分析枚举的内存布局以及常用指令

    一. 简单的枚举类型 简单枚举 调试技巧: 查看变量的内存地址:创建后 -> 断点 - > 最下面调试窗口 -> ...

  • 谈谈Swift中的枚举内存布局

    谈谈Swift中的枚举内存布局谈谈Swift中的枚举内存布局

  • 谈谈Swift中的枚举内存布局

    在掘金上看到从 汇编 到 Swift 枚举内存 的惊鸿一瞥之后,作者分析了几种不同枚举的内存布局,但是我感觉覆盖的...

  • iOS-Swift-枚举变量的内存布局

    枚举章节讲了下枚举,本文就详细分析枚举变量的内存布局。 创建命令行项目,执行如下代码: 点击View Memory...

  • 从零学习Swift 03:汇编分析枚举内存

    今天我们用汇编分析一下枚举的内存布局. 一:普通枚举 通过打印结果看到普通枚举类型的枚举变量只占用了一个字节,那么...

  • 汇编分析枚举的内存布局

    开始今天的内容之前先上个小工具思考下面枚举变量的内存布局 思考:上面三个赋值对内存有什么影响呢?不妨打印一下看看:...

  • swift记录之观察枚举的内存分布

    内存分析 思考枚举变量的内存布局 所以从图上可以看出 关联值的内存分布 总结: ,上述中24>16>8>1所以最大...

  • Swift~汇编分析枚举的内存布局

    本文源自本人的学习记录整理与理解,其中参考阅读了部分优秀的博客和书籍,尽量以通俗简单的语句转述。引用到的地方如有遗...

  • Swift 中的枚举

    本文主要从内存和汇编去分析枚举的关联值和原始值 枚举成员值 用法 枚举的声明如下: 使用: 内存分析 通过Memo...

  • LLDB调试的实际应用

    一、常用命令 1. 打印(print) p指令可打印其对象类型、内存地址以及该对象的值等具体信息, po指令则是打...

网友评论

      本文标题:第四节 分析枚举的内存布局以及常用指令

      本文链接:https://www.haomeiwen.com/subject/rhdtwctx.html