登录
首页 >  Golang >  Go问答

逃逸分析之前变量的生命周期是怎样的?

来源:stackoverflow

时间:2024-04-24 11:36:34 205浏览 收藏

从现在开始,努力学习吧!本文《逃逸分析之前变量的生命周期是怎样的?》主要讲解了等等相关知识点,我会在golang学习网中持续更新相关的系列文章,欢迎大家关注并积极留言建议。下面就先一起来看一下本篇正文内容吧,希望能帮到你!

问题内容

首先,如果这是一个明显或直接的答案,我深表歉意,但我似乎无法理解以下代码背后的确切过程。

package main

import (
    "fmt"
)

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

func main() {
    num := xyz()
    fmt.Println("The number is", *num)
}

我的问题是变量 n 是否在逃逸分析之前分配到堆栈,然后一旦超出范围,它是否会在分配到堆之前被垃圾收集?当函数 xyz 返回时,golang 如何处理指针?我要求提供一些技术性的分步流程,同时也为了消除任何知识差距。


解决方案


转义分析在编译时进行。当编译器意识到变量 n 的地址离开函数时,它会编译一个如下所示的函数:

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

这里,newinheap 是一个假设函数,它总是在堆中分配变量。如果变量没有转义函数,则常规 new 可能会在堆栈上分配变量。

返回指针的生命周期在运行时由常规 gc 规则控制。

到这里,我们也就讲完了《逃逸分析之前变量的生命周期是怎样的?》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>