Defer

command
v0.0.0-...-48c9e09 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 23, 2019 License: MIT Imports: 3 Imported by: 0

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要逃逸到堆山。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL