我正在学习 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
...
这可能会有所帮助:分配效率。
此外,由于切片很小,因此很少看到指向切片的指针:指针、长度和容量。请参阅切片内部。
- 1 回答
- 0 关注
- 132 浏览
添加回答
举报
0/150
提交
取消