Go语言之逃逸

栏目: IT技术 · 发布时间: 4年前

内容简介:转自微信公众号“灰子学技术”,原文链接:https://mp.weixin.qq.com/s/8o8MsExj5BLje38TZoZG5g本篇做为Go语言内存管理的第一篇文章,会从下面几个方向来讲述:在开始讲逃逸之前,我们先看一下,下面的两个例子。

转自微信公众号“灰子学技术”,原文链接:https://mp.weixin.qq.com/s/8o8MsExj5BLje38TZoZG5g

本篇做为 Go 语言内存管理的第一篇文章,会从下面几个方向来讲述:

1.什么是逃逸?
2.为什么需要逃逸?
3.逃逸是怎么实现的?

一、什么是逃逸

在开始讲逃逸之前,我们先看一下,下面的两个例子。

例子1:stack.go的fun()返回的就是一个int变量。

例子2:mem.go的fun()返回的是*int变量,同时里面的返回值是&i。

源代码如下所示:

Go语言之逃逸

$ go tool compile -S stack.go //生成汇编语句

Go语言之逃逸

汇编结果分析:通过汇编可以看出来,在mem.go中的fun()中的变量i是通过newobject(XX)来生成的数据,这就说明,这个i是存储在对中。

备注:newobject(XX)函数的定义如下所示:

Go语言之逃逸

看到上面的例子,有没有觉得很奇怪,为什么mem.go的fun()函数中的i,明明是变量,但是却存储在堆中?

这个其实就是Go语言的 逃逸 ,编译器通过执行静态代码的分析去决定,到底一个变量是应该分配到一个栈上面,还是需要逃逸到一个堆上面。

二、为什么需要逃逸

在分析逃逸之前,我们需要先看下Go语言中的 堆。

在Go语言中,堆作为第二存储位置,Go会优先将数据存在栈里面的。堆是不会自己释放分配的内存的,需要通过GC(garbage collector)也就是垃圾收集器来回收这些分配好的内存。

Go中的栈数据,不能作为指针指向的存储位置。 原因是: goroutine的栈会在栈扩容或者缩减的时候,指向 不同的存储块 。例子如下所示:

Go语言之逃逸

(摘自:https://play.golang.org/p/pxn5u4EBSI)

一旦指针指向这种栈存储位置,就会在运行的时候出现异常,而Go编译器要想解决这个问题,就会变的更复杂,所以Go的指针就不能指向栈中的存储地址。

想来这个应该也是Go逃逸的数据存储到堆中的原因了。

三、逃逸是怎么实现的

还是以mem.go作为例子,如下所示:

Go语言之逃逸

Output: //./mem

Go语言之逃逸

执行$ go build -gcflags "-m -m" mem.go 会得到下面的分析结果:

Go语言之逃逸

结果分析:通过输出的结果,我们可以看到line 10的 i, 会根据line 12的return &i来决定,将变量i 分配到堆上面。

逃逸的内存分配如下所示:

1. main函数和fun函数,分别会有两个栈信息,分别为main frame和fun frame,如下图所示。

2.在fun frame中,变量i会在heap中分配对应的数据,地址为0xc000014080,变量值此时为0。

3.main函数在调用fun()之后,会copy一份i的值给变量a,此时的a的地址是0xc0000c028,存的值是i的地址0xc000014080,这个地址在堆中。

4.不管是在fun还是在main函数中,操作地址0xc000014080就可以取到对应的数值。

Go语言之逃逸

参考资料:

Language Mechanics On Escape Analysis:https://www.ardanlabs.com/blog/2017/05/language-mechanics-on-escape-analysis.html

Go's Memory Allocator - Overview:https://andrestc.com/post/go-memory-allocation-pt1/

灰子学技术:

Go语言之逃逸


以上所述就是小编给大家介绍的《Go语言之逃逸》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

暗时间

暗时间

刘未鹏 / 电子工业出版社 / 2011-7 / 35.00元

2003年,刘未鹏在杂志上发表了自己的第一篇文章,并开始写博客。最初的博客较短,也较琐碎,并夹杂着一些翻译的文章。后来渐渐开始有了一些自己的心得和看法。总体上在这8年里,作者平均每个月写1篇博客或更少,但从未停止。 刘未鹏说—— 写博客这件事情给我最大的体会就是,一件事情如果你能够坚持做8年,那么不管效率和频率多低,最终总能取得一些很可观的收益。而另一个体会就是,一件事情只要你坚持得足......一起来看看 《暗时间》 这本书的介绍吧!

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具