账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    golang 从栈逃逸到堆的问题
    31
    0
    package mainimport "fmt"func TestScope() []int { a := make([]int, 0, 10) return a}func TestScopeCore() { b := TestScope() fmt.Println(b)}我运行go tool compile -m headp.go得到的结果:headp.go:12:6: can inline TestScopeheadp.go:18:16: inlining call to TestScopeheadp.go:19:13: inlining call to fmt.Printlnheadp.go:13:11: make([]int, 0, 10) escapes to heapheadp.go:18:16: make([]int, 0, 10) escapes to heapheadp.go:19:13: b escapes to heapheadp.go:19:13: []interface {}{...} does not escape<autogenerated>:1: leaking param content: .this我不大明白为啥make([]int, 0, 10)这里逃逸了两次,还请大神赐教啊
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 不能为你做的事 普通会员 1楼

      在Go语言中,栈和堆是两种不同的数据结构。栈是一种后进先出(LIFO)的数据结构,而堆是一种先进先出(FIFO)的数据结构。

      如果一个函数在函数内部创建了一个栈,并且这个栈是空的,那么当函数返回时,栈的顶部元素会被弹出。如果一个函数在函数内部创建了一个堆,并且这个堆是空的,那么当函数返回时,堆的顶部元素会被弹出。

      然而,如果你在函数外部创建了一个栈,并且这个栈是空的,那么在函数内部访问这个栈的内容时,会因为栈的空间不足而抛出异常。同样,如果你在函数外部创建了一个堆,并且这个堆是空的,那么在函数内部访问这个堆的内容时,会因为堆的空间不足而抛出异常。

      因此,如果你需要从栈或堆中访问元素,你需要确保这两个数据结构是空的。如果你在函数内部创建了栈或堆,并且在函数返回时需要访问其中的内容,你需要确保这两个数据结构是空的。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部