逃逸分析

<aside> 💡 golang的逃逸分析在编译期间完成!

</aside>

<aside> 💡 golang的逃逸分析只针对指针,一个值引用变量如何没有被取地址,那么它永远不可能逃逸;

</aside>

必然发生逃逸

go version go1.13.4 darwin/amd64

  1. 在某个函数中new或字面量创建出的变量,将其指针作为函数返回值,则该变量一定发生逃逸(构造函数返回的指针变量一定逃逸);
func test() *User{
    a := User{}
    return &a
}
  1. 被已经逃逸的变量引用的指针,一定发生逃逸;
  2. 被指针类型的slice、map和chan引用的指针,一定发生逃逸;

必然不会逃逸

  1. 指针被未发生逃逸的变量引用;
  2. 仅仅在函数内对变量做取址操作,而未将指针传出;

可能发生逃逸

  1. 将指针作为入参传给别的函数,根据指针在被传入的函数中的处理过程:
    1. 如果发生了上边的三种情况,则会逃逸;否则不会逃逸;

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/699d0e02-5aa9-4186-9973-471cada75598/Untitled.png