go - 转义分析,将 var(s) 声明为指针
问题描述
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
被发送到一个函数,并且该函数可能会在函数返回后生成可能持有对的引用的 goroutine cs
,因此将其移动到堆中。
在第二种情况下,cs
是一个指针。不需要将指针本身移动到堆中,因为函数Unmarshal
可以引用的是 指向的对象cs
,而不是cs
自身。您没有显示如何cs
初始化,因此这段代码将失败,但是如果您初始化cs
指向在该函数中声明的变量,则该对象可能最终会出现在堆中。
推荐阅读
- amazon-web-services - 使用 UpdateItemEnhancedRequest DynamoDb java sdk2 更新特定属性
- python - 我想根据列对工作表中 excel 文件中存在的数据进行排序。(excel文件有多个工作表)
- openvpn - OpenVPN 路由已成功添加,但 http 服务器上的连接超时
- r - 将字符串变为数字,忽略因子的字母顺序
- ios - 带有 Testflight 应用程序版本号的网站
- c# - 如何从 Dictionary 对象创建一个 json 结构?
- c++ - c++ opencv Mat 值
- ios - Firebase - 如何使用云函数运行计算
- java - 我无法更新 SQLite 中的值
- c++ - 源文件中模板类的 C++ 模板函数定义