inout 从 汇编 验证Swift的 inout 本质( 三 )


2.1 0x100001b06 : movq %rax,-0x10
2.2 0x 100001 b0a:callq 0x 100001 a10;我退出。Swift.Int在梅恩。斯威夫特:23岁
2.3 0x100001b0f : movq -0x8,%rcx
2.4 0x100001b13 : movq %rax,0x8
2.5 0x100001b17 : leaq 0x12,% rax我退出。修改:Swift.Int在
2.6 0x100001b1e : movq -0x10,%rdx
2.7 0x100001b22 : addq x10,%rsp
2.8 0x100001b26 : popq %rbp
2.9 0x100001b27 : retq
第2行-> 1:
movq %rax,-0x10
将寄存器rax%中存储的地址指向-0x10堆栈空
第2行-> 2:
您看到的是count的getter方法,这意味着在change函数之前,您将首先获得count的值,age = 18,然后count是9
寄存器读取rax
rax = 0x0000000000000009
第2行-> 6:
movq -0x10,%rdx
此时,-0x10指向分配给rdx%的地址值rax%
Rdx%存储9的地址。结束通话
超过
呼叫结束*rdx
第5行:
更改函数调用,与前面的分析相同
此时,rdi%通过更改返回的rax%已被修改为后续参数的20
第7行:
Callq *%rax,传入rdi%
点击si进入callq *%rax,可以看到一张熟悉的脸
inout`Person.count.modify:
->
0x 100001 b3e:callq 0x 100001980;我退出。二传手:梅恩的Swift.Int。斯威夫特:20
Setter函数的计数,所以我想你已经明白了。
摘要
类的计算属性不同于存储属性,地址不会直接传入
计算属性的getter值,然后将该值存储在地址中
将地址传入inout,并修改地址中存储的值
结果被传递到计算属性的设置器中
带有属性观察器的类属性也类似于计算属性
下图:

inout 从 汇编 验证Swift的 inout 本质


文章图片

复制入复制出
inout的本质是引用地址的传输
该职能具有单一责任的特点
inout函数就像一个黑盒。我们所要做的就是传入需要修改的变量的地址
复制输入复制输出就是这种行为
参数传入,并复制临时变量的地址
修改函数中临时变量的值
函数返回,临时变量被分配给原始参数
摘要
本文只是对类的计算和存储属性做了一个简单的验证,类似于Struct
区别可能只是类和结构的内存分布
读者可以自行分析
感谢阅读。
让我们在强者的道路上秃顶吧!!

推荐阅读