[英]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.