簡體   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