Go ';容量';使用“不安全”将[]字节转换为字符串时的内存?
我见过人们使用Go ';容量';使用“不安全”将[]字节转换为字符串时的内存?,go,Go,我见过人们使用不安全的指针有效地将[]字节转换为字符串 我了解它在做什么,以及一般涉及的危险,但对记忆有疑问 由于片的结构有一个数据指针、一个长度和一个容量,但字符串没有容量,如果在堆上创建了b,内存会发生什么变化?垃圾收集器是否知道需要单独跟踪容量?或者这会导致内存泄漏吗 编辑: 我知道如何重新切片字符串和切片。上述代码适用于需要从[]字节转换为字符串但希望避免完整副本的情况 问题是关于我们从结构中删除的容量以及它是否会导致GC问题。语句var s=*(*string)(unsafe.Poin
不安全的指针
有效地将[]字节
转换为字符串
我了解它在做什么,以及一般涉及的危险,但对记忆有疑问
由于片的结构有一个数据指针、一个长度和一个容量,但字符串没有容量,如果在堆上创建了b
,内存会发生什么变化?垃圾收集器是否知道需要单独跟踪容量?或者这会导致内存泄漏吗
编辑:
我知道如何重新切片字符串和切片。上述代码适用于需要从[]字节
转换为字符串
但希望避免完整副本的情况
问题是关于我们从结构中删除的
容量以及它是否会导致GC问题。语句var s=*(*string)(unsafe.Pointer(&b))
将数据和长度从值复制到值
该语句不会更改运行时对切片标头的解释。容量不会从切片标头中删除
仅复制数据和长度不会导致GC问题
- 复制操作后,字符串标头和切片标头值都有效李>
- 垃圾收集器不假定字符串备份数组的大小等于字符串头中的长度。例如,GC处理安全代码
s:=“foobarxxx”[:6]
,其中字符串头s
的长度为6,而后备数组的大小为9
谢谢,但这是从字符串开始的。我上面显示的代码是当您得到一个[]字节时,但需要将其转换为字符串,并希望避免复制。好的,这是有意义的。s
是标头的副本,因此数据指针和长度被复制到新内存中,而原始标头是一个完全独立的实体,可以单独跟踪。谢谢
var b = []byte{'f', 'o', 'o', 'b', 'a', 'r'}
var s = *(*string)(unsafe.Pointer(&b))