# defer 的底层原理是怎样的?

思路

  • 协程记录defer信息,函数退出时调用
  • 将 defer 代码直接编译进函数尾

思路1 堆上分配

  • 1.12 之前使用(需要处理垃圾回收的问题)
  • 在堆上开辟一个sched.deferpool
  • 遇到defer语句,将信息放入deferpool
  • 函数返回时,从 deferpool 取出执行

思路2 栈上分配

  • 1.13 之后出现
  • 遇到 defer 语句,将信息放入栈上
  • 函数返回时,从栈中取出执行
  • 只能保存一个defer信息(防止栈空间太大)

思路3 开放编码

  • 1.14 之后出现的
  • 如果 defer 语句在编译时就可以固定
  • 直接改写用户代码,defer语句放入函数末尾
  • 效率最高,代码改动最小
  • 需要在编译时触发,触发条件比较难

总结

  • defer 可以方便业务的编写
  • defer 有两种思路,三种实现
  • 性能最高的是开放编码
上次更新: 3/12/2023,