一个逃逸分析问题,求指教

coderyw · 2022-06-23 18:50:37 · 2795 次点击
jan-bar
想要拥有,必定付出。

我运行了如下代码,浏览器打开 http://127.0.0.1:4500/debug/pprof/ ,然后点击allocs,一直刷新页面看到Stack =栈分配没有增加,所以我觉得不会随着程序的运行导致栈空间占满。点击heap里面的Stack =也是没有增加的。

package main

import (
    "fmt"
    "net/http"
    _ "net/http/pprof"
    "time"
)

func main() {
    pc := make(chan t)
    go rcv(pc)
    go func() {
        for {
            tt := t{}
            pc <- tt
            time.Sleep(time.Second)
        }
    }()
    _ = http.ListenAndServe(":4500", nil)
}

type t struct {
    A int
}

func rcv(pc chan t) {
    for {
        p := <-pc
        p.A = 1
        fmt.Printf("p: %p\n", &p)
    }
}
#3
更多评论
jan-bar
想要拥有,必定付出。

看到一篇文章:Golang 元素值在经过通道传递时会被复制,这个复制是浅复制

如果通道传递值类型,实际就是完整的复制,发送端和接收端的数据不是同一个,所以不存在逃逸。

如果传递引用类型,由于只是引用被复制,例如指针地址被传过去了,这时候就存在逃逸。

#1

这个我知道,问题是,就我了解的,没有逃逸的数据分配在函数栈上,然后等函数结束时候,就被一起释放。但是我这个函数,是一直运行,一直接收数据,问题就是数据会一直分配在栈上,不会导致栈空间不足吗?还是我对栈这里的理解有问题。。

#2