实现类似于GO关键字。
将指令调用Runtime.deferProc放在延期出现的位置,然后插入呼叫运行时。DEFERERTURN函数返回的位置。在Goroutine的控制结构中,有一个表记录延期。在调用Runtime.deferProc时,需要推迟的表达式记录在表中。调用运行时。驱逐回收时,它将依次从登录表中“从堆栈中”,然后从defer表中“从堆栈中”。
如果有多个防御能
延期信息将注册到链接列表。当前执行的Goroutine持有此链接列表的头指针。每个Goroutine都有一个相应的结构结构G。一个字段指向此延期链接列表标头
新注册的延期将添加到链接列表中,因此感觉就像堆栈一样的呼叫的进步
延期总共有两个参数。第一个是参数的大小和返回值,第二个是funcval的指针
将参数编写为堆,然后在执行时复制参数(参数和返回值)
GO将使用不同的规格分配_defer池。执行后,将一个从free_defer中取出。没有适当的加固分配。使用它后,将其放回free_defer池。避免频繁的堆分配和回收
GO1.12中存在的推迟问题
GO1.13中的延期优化
GO1.14中的延期优化
defer添加局部变量以确定是否有必要执行。
deferProcstack
Youlin实验室
进行语言设计和实施
原始:https://juejin.cn/post/7101887123539623944