1 回答
TA贡献1880条经验 获得超4个赞
Go 不允许直接控制您使用的内存的分配位置。
如果您不使用引用,则内存是从堆栈分配的。
如果您传递引用,编译器会进行转义分析以尝试从堆栈分配内存,但如果失败,则会在堆上分配内存。
您可以使用-gcflags '-m -l'查看程序的逃逸分析。
go run -gcflags '-m -l' main.go
例如,在下面的程序中验证逃逸分析。
package main
import (
"fmt"
"io"
"os"
)
func main() {
fmt.Printf("%v\n", work())
}
type Foo struct {
Reader io.Reader
Writer io.Writer
ErrorWriter io.Writer
}
func work() *Foo {
agentUi := &Foo{
Reader: os.Stdin,
Writer: os.Stdout,
ErrorWriter: os.Stderr,
}
return agentUi
}
输出:
$ go run -gcflags '-m -l' main.go
# command-line-arguments
./main.go:20:13: &Foo{...} escapes to heap
./main.go:10:12: ... argument does not escape
&{0xc00000e010 0xc00000e018 0xc00000e020}
- 1 回答
- 0 关注
- 100 浏览
添加回答
举报