为了账号安全,请及时绑定邮箱和手机立即绑定

Go中作为指针附加的局部变量的生命周期

Go中作为指针附加的局部变量的生命周期

Go
繁花不似锦 2022-05-05 18:00:34
我正在学习 Go 并且有 C/C++ 背景。在下面的示例中,将地址附加a到切片中是否安全?当我运行此示例时,2会打印正确的值 ( ),但需要确定一下。如果这是错误的,我该怎么做?func add(mapping map[string]*[]*int) {    sliceptr := &[]*int{}    mapping["foo"] = sliceptr    ele := mapping["foo"]    a := 2    // won't address of `a` go out of scope?    ele2 := append(*ele, &a)    mapping["foo"] = &ele2}func main() {           mapping := map[string]*[]*int{}        add(mapping)            fmt.Println(*(*mapping["foo"])[0])}
查看完整描述

1 回答

?
撒科打诨

TA贡献1934条经验 获得超2个赞

在声明它的函数结束后引用它是安全a的,因为 go 会进行逃逸分析。如果编译器可以证明它可以安全访问,则将其放入堆栈,如果不能,则将其分配到堆上。


构建标志可以对逃逸分析提供一些见解:


go build -gcflags "-m" main.go


...

./main.go:10:2: moved to heap: a

...

这可能会有所帮助:分配效率。


此外,由于切片很小,因此很少看到指向切片的指针:指针、长度和容量。请参阅切片内部。


查看完整回答
反对 回复 2022-05-05
  • 1 回答
  • 0 关注
  • 132 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信