在 Golang 中,unsafe.Pointer() 是否具有引用计数?

4
unsafe.Pointer()指针是否具有引用计数并因此受到垃圾回收的保护?
也就是说,如果我有一个字符串,只要它在范围内,它就存在;如果我有一个* string,只要指针在范围内,字符串就存在。但是如果我有一个unsafe.Pointer(&s)(其中s是字符串或其他),只要不安全的指针仍然指向它,s会保持在范围内吗?
我发现谷歌说一旦转换为uintptr,它肯定不是,因为uintptr只是一个int,但我找不到任何明确的东西关于unsafe.Pointer()是这样还是那样,可能是因为答案很显然,但我不完全确定,因为我找不到确切解释的东西。
如果我将该unsafe.Pointer强制转换为其他指针类型,我认为这不会改变事情?

你可能会发现这些关于逃逸分析和unsafe包的测试很有启发性,https://github.com/golang/go/blob/0d0193409492b96881be6407ad50123e3557fdfb/test/escape_unsafe.go - Brandon Dube
1个回答

4

unsafe.Pointer可以防止指向对象的指针被回收。

此外,Golang使用追踪垃圾回收器而非引用计数。

尽管未明确说明,但通过https://pkg.go.dev/unsafe#Pointer可以推断出这一点。

文档介绍了一些被认为是安全的unsafe.Pointer用法模式。特别地,从T1*转换为Pointer到T2*是合法的,前提是T2不比T1大,并且类型具有“等效内存布局”。

因此,将T*转换为unsafe.Pointer,再转换回T*是安全的,没有任何限制。假如unsafe.Pointer不阻止所引用对象被回收,则这种转换是不安全的。


听起来不错,谢谢。但是,为什么没有人在参考资料中直接说明呢?为什么必须要推断呢? - stu
我意识到我应该说“引用”而不是“引用计数”。 - stu
@stu:编写语言定义是一种艺术:过度规定会导致刚性的语言,将来无法改进;不充分规定则得不到有用的规范;做到恰到好处,则能获得适当的问题。 :-) Go 并没有说明其 GC 工作的方式,只是它有垃圾回收机制,这使得实现可以自由选择使用引用计数 GC,如果某天这被证明是好的话。 - torek
好的,没问题,是的,我只是想表达清楚。我知道当前的Go语言实现使用了一个在两个阶段进行搜索和销毁的垃圾回收器,我只是想为这次讨论选择一个好的术语。但我理解你的观点。 - stu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接