Go分析堆/栈内存

在Go语言中,变量是否在栈上还是在堆上分配是由编译器在编译阶段进行"逃逸分析"决定的。如果一个变量只在函数作用域内部使用,它往往会被分配在栈上;如果一个变量被外部引用,或者被返回到函数外部,那么它就可能"逃逸"到堆上。

要查看一个Go程序的逃逸分析结果,你可以在构建程序时使用-gcflags='-m'选项。例如:

go build -gcflags='-m' main.go

编译器将输出关于变量如何被分配的信息。例如,我们可能会看到类似以下的输出:

./main.go:9:6: can inline foo with cost 5 as: ...
./main.go:14:9: &x escapes to heap
./main.go:14:9: 	from ~r0 (return) at ./main.go:15:2

上述输出表明,在main.go的第14行,变量 x 逃逸到了堆。

猜你喜欢

转载自blog.csdn.net/qq_35760825/article/details/131939811