Documentation ¶
Overview ¶
go run -gcflags '-m -l' escape3.go
z 发生逃逸 z 是对x的拷贝,ref函数中对z取了引用,所以不能放在栈上,通过引用不能找到z,所以z必须要逃逸到堆山。 尽管在main函数中,直接丢弃了ref的结果,但是go的编译器寒梅与那么智能,分析不出来这种情况。 而对x从来就没有去引用,所以x不会发生逃逸.
go run -gcflags '-m -l' escape4.go
y 逃逸 refStruct4 函数对Y取了引用,所以y发送的逃逸
go run -gcflags '-m -l' escape5.go
i 没有发送逃逸
在main函数离对i取了引用并且把它传给refStruct函数,i的引用一直在main函数的作用域使用,因此i没有发生逃逸。
和上一个例子相比,i的写法有一点小差别,但是i的命运是不同的,导致程序小效果是不同的:
例4中i在main函数的作用域栈中分配 本例中i只分配了一次,然后通过引用传递。
* go run -gcflags '-m -l' escape6.go
i 逃逸,x未逃逸,x的作用域一直在main函数中
本列i发生了逃逸,按照前面例子5的分析,i不会逃逸,但是此列中i赋值给了一个输入的struct,go不能从输出反推到输入 两个例子的区别是例子5中的S是在返回值字的,输入只能流入到输出。 本列中的S是在输入参数中,所以逃逸分析失败,i要逃逸到堆山。
Click to show internal directories.
Click to hide internal directories.