繁体   English   中英

Go 逃逸分析,变量声明为指针

[英]Go escape analysis, with var(s) declared as pointers

func main() {
 var cs CustomStruct
 r := []byte{.......}
 err:=proto.Unmarshal(r, &cs)
 if err!=nil {
    panic(err)
  } 
}

当我运行go build -gcflags="-m"./...时,我得到

移动到堆:CustomStruct

但是稍作改动,它就不会移动到堆中:

func main() {
 var cs *CustomStruct
 r := []byte{.......}
 err:=proto.Unmarshal(r, cs)
 if err!=nil {
    panic(err)
  } 
}

现在当我运行 escape-analysis 命令时,它并没有说CustomStruct被移动到堆中。 这里究竟发生了什么?

由于cs的地址被发送到 function 并且 function 可能会产生 goroutines,这些 goroutines 在 function 返回后可能持有对cs的引用,因此它被移动到堆中。

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

proto.Unmarshal

func Unmarshal(buf []byte, pb Message)
type Message interface {
    Reset()
    String() string
    ProtoMessage()
}

interface{}可以是任何类型,编译时很难确定其参数的具体类型,也会出现escape。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM