逃逸分析
<aside>
💡 golang的逃逸分析在编译期间完成!
</aside>
<aside>
💡 golang的逃逸分析只针对指针,一个值引用变量如何没有被取地址,那么它永远不可能逃逸;
</aside>
必然发生逃逸
go version go1.13.4 darwin/amd64
- 在某个函数中new或字面量创建出的变量,将其指针作为函数返回值,则该变量一定发生逃逸(构造函数返回的指针变量一定逃逸);
func test() *User{
a := User{}
return &a
}
- 被已经逃逸的变量引用的指针,一定发生逃逸;
- 被指针类型的slice、map和chan引用的指针,一定发生逃逸;
必然不会逃逸
- 指针被未发生逃逸的变量引用;
- 仅仅在函数内对变量做取址操作,而未将指针传出;
可能发生逃逸
- 将指针作为入参传给别的函数,根据指针在被传入的函数中的处理过程:
- 如果发生了上边的三种情况,则会逃逸;否则不会逃逸;