亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 146 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號