逃逸分析之前的变量生命周期是什么



首先,如果这是一个明显或直接的答案,我很抱歉,但我似乎无法理解下面代码的确切过程。

package main
import (
"fmt"
)
func xyz() *int {
n := 42
return &n
}
func main() {
num := xyz()
fmt.Println("The number is", *num)
}

我的问题是,变量n是否在转义分析之前被分配到堆栈,然后一旦超出范围,它是否在被分配到堆之前被收集垃圾?返回函数xyz时,Golang如何处理指针?我要求一点技术上的循序渐进的流程,但也要消除任何知识空白。

Escape分析在编译时工作。当编译器实现变量n的地址离开函数时,它编译一个如下所示的函数:

func xyz() *int {
n:=newInHeap(int)
*n := 42
return n
}

这里,newInHeap是一个假设函数,它总是在堆中分配变量。如果变量没有转义函数,则正则new可以在堆栈上分配变量。

返回指针的生存期在运行时由常规GC规则控制。

最新更新