为了账号安全,请及时绑定邮箱和手机立即绑定

进行转义分析,将 var(s) 声明为指针

进行转义分析,将 var(s) 声明为指针

Go
月关宝盒 2022-09-26 15:53:32
func main() { var cs CustomStruct r := []byte{.......} err:=proto.Unmarshal(r, &cs) if err!=nil {    panic(err)  } }当我跑步时,我得到go build -gcflags="-m" ./... 已移至堆:自定义结构但是,通过一个小的更改,它不会移动到堆中:func main() { var cs *CustomStruct r := []byte{.......} err:=proto.Unmarshal(r, cs) if err!=nil {    panic(err)  } }现在,当我运行转义分析命令时,它并没有说它被移动到堆中。这到底是怎么回事?CustomStruct
查看完整描述

2 回答

?
波斯汪

TA贡献1811条经验 获得超4个赞

由于 的地址被发送到一个函数,并且该函数可能会生成在函数返回后可能包含对该函数的引用的 goroutine,因此它被移动到堆中。cscs

在第二种情况下, 是指针。没有必要将指针本身移动到堆中,因为函数可以引用的是 指向的对象,而不是本身。您没有显示如何初始化,因此这段代码将失败,但是如果您初始化为指向该函数中声明的变量,则该对象最终可能会出现在堆中。csUnmarshalcscscscs


查看完整回答
反对 回复 2022-09-26
?
饮歌长啸

TA贡献1951条经验 获得超3个赞

proto.Unmarshal


func Unmarshal(buf []byte, pb Message)

type Message interface {

    Reset()

    String() string

    ProtoMessage()

}

接口{}可以是每一种类型,在编译过程中很难确定其参数的具体类型,并且还会发生转义。


但是如果接口{}是一个指针,它只是一个指针


查看完整回答
反对 回复 2022-09-26
  • 2 回答
  • 0 关注
  • 69 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信