Swift 汇编分析结构体
结构体
在Swift标准库中,绝大多数的公开类型都是结构体,而枚举和类只占很小一部分。
比如Bool、int、Double、String、Array、Dictionary等常见的类型都是结构体
所有的结构体都有一个编译器自动生成的初始化器
调用的时候所有成员的值都要初始化,否则报错,保证所有成员都要有初始值
一旦在定义结构体时自定义了初始化器,编译器就不会在帮他自动生成其他初始化器(调用init方法)
结构体是值类型 (枚举也是值类型)
值类型函数创建存储在栈空间,指针变量的地址存储在栈空间,但是地址指向的内容存储在堆空间
窥探初始化器的本质

汇编代码分析

首先会调用init方法进入函数内部,找到立即数:movq $0x0,-0x10(%rbp)和movq $0x0,-0x8(%rbp)这里就是给两个局部变量赋值分配内存空间
结构体分析


汇编代码分析
movl $0xa, %eax 10赋值给eax寄存器,eax属于rax,所以10复制给rax寄存器
movq %rax, %rdi 10赋值给rdi寄存器
movl $0x14, %eax 20->eax->rax
movq %rax, %rsi 20->rsi
中间有一步调用函数将rdi赋值给rax,rsi赋值给rdx
movq %rax,0x662d(%rip) 将10赋值给一个地址其实就是p1的内存地址 占8个字节
movq %rdx,0x662e(%rip) 将20赋值给rip+0x662e这个地址,10和20是连续的16个字节
movq 0x6603(%rip), %rax 取出rip+0x6603的地址,其实就是0x662d(%rip)的地址,rip是不相同的 也就是将10复制给rax寄存器
movq %rax,0x660c(%rip) rip+0x660c =0x100000bfc+0x660c p2的内存地址
movq 0x65fd(%rip), %rax 20