golang 源码剖析(7): 延迟defer

简介延迟调用(defer)的优势是:即使函数执行出错,依然能保证回收资源等操作得以执行可以在变量的定义处加入defer,代码结构上避免忘记做某些数据的回收劣势:性能上会会比直接调用慢一些如果在defer中释放,相对来说只会在函数执行结束的时候才会调用,变量生命周期会变长.定义编写以下程序, dump出汇编.defer主要调用了一下两个函数func deferprocSta...
摘要由CSDN通过智能技术生成

简介

延迟调用(defer)的优势是:

  1. 即使函数执行出错,依然能保证回收资源等操作得以执行
  2. 可以在变量的定义处加入defer,代码结构上避免忘记做某些数据的回收

劣势:

  1. 性能上会会比直接调用慢一些
  2. 如果在defer中释放,相对来说只会在函数执行结束的时候才会调用,变量生命周期会变长.

定义

编写以下程序, dump出汇编.
defer主要调用了一下两个函数func deferprocStack(d *_defer)func deferreturn(arg0 uintptr)

package main

import (
	"fmt"
)

func main() {
	defer fmt.Println(0x11)
}
(base) ➜  readsrc go tool objdump -s "main\.main" ./test
TEXT main.main(SB) /home/darcyaf/Development/go/src/readsrc/main.go
  main.go:7             0x48cf30                64488b0c25f8ffffff      MOVQ FS:0xfffffff8, CX
  main.go:7             0x48cf39                488d4424d8              LEAQ -0x28(SP), AX
  main.go:7             0x48cf3e                483b4110                CMPQ 0x10(CX), AX
  main.go:7             0x48cf42                0f86b1000000            JBE 0x48cff9
  main.go:7             0x48cf48                4881eca8000000          SUBQ $0xa8, SP
  main.go:7             0x48cf4f                4889ac24a0000000        MOVQ BP, 0xa0(SP)
  main.go:7             0x48cf57                488dac24a0000000        LEAQ 0xa0(SP), BP
  main.go:8             0x48cf5f                0f57c0                  XORPS X0, X0
  main.go:8             0x48cf62                0f11842490000000        MOVUPS X0, 0x90(SP)
  main.go:8             0x48cf6a                488d050f190100          LEAQ 0x1190f(IP), AX
  main.go:8             0x48cf71                4889842490000000        MOVQ AX, 0x90(SP)
  main.go:8             0x48cf79                488d05a0cd0400          LEAQ 0x4cda0(IP), AX
  main.go:8             0x48cf80                4889842498000000        MOVQ AX, 0x98(SP)
  main.go:8             0x48cf88                c744243030000000        MOVL $0x30, 0x30(SP)
  main.go:8             0x48cf90                488d0561c8030
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值