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