美文网首页
defer 2023-02-04

defer 2023-02-04

作者: 9_SooHyun | 来源:发表于2023-02-03 12:36 被阅读0次

Defer底层是一个名为_defer的结构体
若干个_defer结构体构成链表

_defer结构体在内存的分配位置

分配方式分为3类:堆上动态分配、栈上动态分配、open-coded的栈上静态分配

堆上动态分配

一个函数有几个defer方法是动态的、不确定的,因此链表长度不定,一开始就干脆设计成分配在堆上

栈上动态分配

后来发现堆上内存频繁分配和回收,就改成往栈上分,这样可以自动随着栈退出而回收内存(当然栈空间不够的话还是往堆上分配)

open-coded的栈上静态分配

再后来,继续优化。对于函数内一定数量内的defer 方法,使用defer bit 来cover 住所有可能的情况,从而将动态的defer【静态化】,这样在编译时,就可以把defer的逻辑插入函数体内一起被编译

多个defer,为什么后defer先执行

本质上是因为后来的_defer总是被添加到_defer链的头部,而当执行_defer链的时候是从链表头开始向后依次执行

参考https://draveness.me/golang/docs/part2-foundation/ch05-keyword/golang-defer/

相关文章

  • Defer; defer; defer

    作者:Erica Sadun,原文链接,原文日期:2016-11-14译者:Cyan;校对:小铁匠Linus;定稿...

  • boost msm defer 1

    defer codes defer logs

  • go defer易错知识总结

    目录 defer执行时机 defer执行顺序 defer与return谁先谁后 函数包含多个Panic,defer...

  • 29. Defer

    29. Defer 什么是 defer? defer 语句的用途是:含有 defer 语句的函数,会在该函数将要返...

  • Go Defer

    Go Defer 如果函数里面有多条defer指令,他们的执行顺序是反序,即后定义的defer先执行。 defer...

  • Swift defer & guard

    2019-01-29Swift defer 简单解答 1. defer是什么? The defer keyword...

  • Swift中defer的使用

    defer:defer中的代码将延迟至当前作用域结束之前执行注意:必须有执行到defer,才会触发defer。如果...

  • golang中defer执行时机与常见问题

    defer是什么? defer的用途 defer的执行时机 了解defer的执行时机首先要知道golang的ret...

  • Golang之Defer

    引用 golang defer实现原理 Golang之轻松化解defer的温柔陷阱 Golang中defer、re...

  • goLang异常处理

    defer defer是go提供的一种资源处理的方式。defer的用法遵循3个原则在defer表达式被运算的同时,...

网友评论

      本文标题:defer 2023-02-04

      本文链接:https://www.haomeiwen.com/subject/slhnhdtx.html