知识卡片

转换可能复制

普通读书笔记卡 · 1471.a.1

内容

字符串与 []byte 的互转常常意味着复制和分配,因为前者只读、后者可变。性能敏感路径要把转换次数纳入设计;这和 [[逃逸分析原则]] 一样,都是减少隐藏分配的入口。

参考来源

- 位置:《Go语言底层原理剖析》第5章《字符串本质与实现》5.4.4节《字符串与字节数组的转换》 - 结论依据:原文指出字节数组与字符串"并不是简单的指针引用,而是涉及了复制",转换时运行时分别调用 slicebytetostring、stringtoslicebyte 函数,"当字符串大于32字节时,还需要申请堆内存",因此可以推出"字符串与[]byte互转常意味着复制和分配"的结论。 - 原始内容:字节数组与字符串可以相互转换……字节数组转换为字符串在运行时调用了slicebytetostring函数。需要注意的是,字节数组与字符串的相互转换并不是简单的指针引用,而是涉及了复制。当字符串大于32字节时,还需要申请堆内存,因此在涉及一些密集的转换场景时,需要评估这种转换带来的性能损耗。当字符串转换为字节数组时,在运行时需要调用stringtoslicebyte函数……当字符串大于32字节时,rawbyteslice函数需要向堆区申请足够的内存空间。