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

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

Go 1.6 編譯器在 []byte 和 string 之間轉換時應用哪些優化,反之亦然?

Go 1.6 編譯器在 []byte 和 string 之間轉換時應用哪些優化,反之亦然?

Go
HUWWW 2021-12-20 16:33:58
我知道從 []byte 轉換為字符串,反之亦然,會導致生成底層數組的副本。從字符串不可變的角度來看,這對我來說很有意義。然后我在這里讀到編譯器在特定情況下進行了兩個優化:“當使用 []byte 鍵在 map[string] 集合中查找條目時,第一個優化避免了額外的分配:m[string(key)]?!边@是有道理的,因為轉換只限于方括號,所以沒有改變那里的字符串的風險?!暗诙€優化避免了在字符串被轉換為 []byte: for i,v := range []byte(str) {...} 的范圍子句中的額外分配?!边@是有道理的,因為再次 - 無法在這里改變字符串。還提到了對待辦事項列表的進一步優化(不確定指的是哪個待辦事項列表),所以我的問題是:Go 1.6 中是否存在任何其他此類(進一步)優化,如果存在,它們是什么?
查看完整描述

1 回答

?
PIPIONE

TA貢獻1829條經驗 獲得超9個贊

[]字節到字符串

對于[]bytetostring轉換,編譯器在可以證明時生成對內部runtime.slicebytetostringtmp函數的調用(鏈接到源)


在調用 goroutine 可能修改原始切片或與另一個 goroutine 同步之前,字符串形式將被丟棄。


runtime.slicebytetostringtmp返回string對實際[]byte字節的引用,因此它不會分配。函數中的注釋說


// First such case is a m[string(k)] lookup where

// m is a string-keyed map and k is a []byte.

// Second such case is "<"+string(b)+">" concatenation where b is []byte.

// Third such case is string(b)=="foo" comparison where b is []byte.

簡而言之,對于一個b []byte

  • 地圖查找m[string(b)]不分配

  • "<"+string(b)+"> 串聯不分配

  • string(b)=="foo" 比較不分配

第二次優化于2015年1月22日實施,在go1.6

第三次優化于2015年1月27日實施,在go1.6

因此,例如,在以下內容中:

var bs []byte = []byte{104, 97, 108, 108, 111}


func main() {

    x := string(bs) == "hello"

    println(x)

}

比較不會導致 go1.6 中的分配。


字符串到 []byte

同樣,runtime.stringtoslicebytetmp函數(鏈接到源)說:


// Return a slice referring to the actual string bytes.

// This is only for use by internal compiler optimizations

// that know that the slice won't be mutated.

// The only such case today is:

// for i, c := range []byte(str)

所以i, c := range []byte(str)不分配,但你已經知道了。


查看完整回答
反對 回復 2021-12-20
  • 1 回答
  • 0 關注
  • 207 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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