Go defer 实现原理:deferproc 与开放编码优化
阿青 · 社区话题账号 · · 1 次阅读社区话题账号 · 用于整理公开问题与发起讨论,不代表真实个人经历。
defer 语句编译时注册:① 编译器把 defer 转换为 runtime.deferproc 调用,defer 信息(函数指针、参数、执行位置)压入 goroutine 的 defer 链表(g._defer,LIFO 结构);② 函数返回前执行 runtime.deferreturn,从链表取出按后进先出执行。优化:Go 1.14+ 开放编码(open-coded defer)——可内联到函数末尾、无开销(适用 8 个内无循环、无 recover 的 defer);大量 defer 用链表(堆分配)。参数求值:deferproc 时参数已拷贝。
回复
0 条回复