go interface 带来的内存逃逸现象

type I interface {
	F() int
}
type A struct{
	x int
	y int
}
func (a *A) F() int {
	z := a.x + a.y
	return z
}

func test(){
	//&A不会发生逃逸现象  0.272 ns/op
	//var a = &A{}
	//a.F()
	//&A不会发生逃逸现象 20.6 ns/op
    a = &A{}
	var i I = a
	i.F()
}


func BenchmarkX(b *testing.B) {
	b.ReportAllocs()
	for i:=0; i<b.N; i++ {
		test()
	}
}

这里有的文章会说&A 是因为内联原因导致的,经过我的分析是因为逃逸现象的产生。从下面我可以清晰的发现当我们将&A 复制给interface 类型的时候发生了内存逃逸现象。

F:\gotest> go build -gcflags="-m -m" inline.go
inlining call to (*A).F method(*A) func() int { z := a.x + a.y; return z }
.\inline.go:10:7: a does not escape
.\inline.go:16:10: &A literal does not escape
<autogenerated>:1: parameter .this leaks to {heap} with derefs=0:
<autogenerated>:1:   flow: {heap} = .this:
<autogenerated>:1:     from .this.F() (call parameter) at <autogenerated>:1
<autogenerated>:1: leak
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值