gpt4 book ai didi

go - 在 []byte 和 string 之间转换时,Go 1.6 编译器应用了哪些优化,反之亦然?

转载 作者:IT王子 更新时间:2023-10-29 00:39:21 24 4
gpt4 key购买 nike

我知道从 []byte 转换为字符串,反之亦然,会导致生成底层数组的副本。从字符串不可变的角度来看,这对我来说很有意义。

然后我读了here编译器在特定情况下进行了两项优化:

“当 []byte 键用于查找 map[string] 集合中的条目时,第一个优化避免了额外分配:m[string(key)]。”

这是有道理的,因为转换的范围仅限于方括号,因此不会有改变那里字符串的风险。

“第二个优化避免了 for range 子句中的额外分配,其中字符串被转换为 []byte: for i,v := range []byte(str) {...}。”

这是有道理的,因为再一次 - 没有办法改变这里的字符串。

还提到了待办事项列表的进一步优化(不确定指的是哪个待办事项列表),所以我的问题是:

Go 1.6 中是否存在任何其他此类(进一步)优化,如果有,它们是什么?

最佳答案

[]字节转字符串

对于 []bytestring转换后,编译器生成对内部 runtime.slicebytetostringtmp 的调用function ( link to source ) 可以证明

that the string form will be discarded before the calling goroutine could possibly modify the original slice or synchronize with another 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 :

  • map 查询 m[string(b)]不分配
  • "<"+string(b)+">串联不分配
  • string(b)=="foo"比较不分配

第二个优化是implemented 2015年1月22日,在go1.6中

第三个优化是implemented 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函数(link to source)说:

// 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)不分配,但你已经知道了。

关于go - 在 []byte 和 string 之间转换时,Go 1.6 编译器应用了哪些优化,反之亦然?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35911953/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com