在 golang 中,是否计算了 unsafe.Pointer() 的引用?
in golang, are unsafe.Pointer()s reference counted?
是否对 unsafe.Pointer() 的引用进行计数,从而避免被垃圾收集?
例如,如果我有一个字符串,它在范围内时就存在,如果我有一个 *string,则该字符串在指针在范围内时就存在,但是如果我有一个 unsafe.Pointer(&s )(其中 s 是一个字符串或其他什么)只要不安全指针仍指向它,s 就会留在范围内吗?
我发现谷歌说一旦你转换为 uintptr 就绝对不是,因为 uintptr 只是一个 int,但我找不到关于 unsafe.Pointer() 的任何确定的方式可能是因为答案很明显,但我不是很确定,因为我找不到任何能准确解释它的东西。
如果我将 unsafe.Pointer 转换为其他指针类型,我认为这不会改变什么?
unsafe.Pointer 阻止收集指针对象。
此外,Golang 使用跟踪垃圾收集器,而不是引用计数。
这没有明确拼写,但可以从 https://pkg.go.dev/unsafe#Pointer
中推断出来
该文档介绍了一些 unsafe.Pointer 被认为是安全的使用模式。特别是,从 T1* 到指向 T2* 的指针的转换是有效的,前提是 T2 不大于 T1 并且类型具有“等效内存布局”。
因此,从 T* 到 unsafe.Pointer 并返回到 T* 的转换是安全的,没有任何限制。如果 unsafe.Pointer 没有阻止收集引用的对象,那将是不安全的。
是否对 unsafe.Pointer() 的引用进行计数,从而避免被垃圾收集?
例如,如果我有一个字符串,它在范围内时就存在,如果我有一个 *string,则该字符串在指针在范围内时就存在,但是如果我有一个 unsafe.Pointer(&s )(其中 s 是一个字符串或其他什么)只要不安全指针仍指向它,s 就会留在范围内吗?
我发现谷歌说一旦你转换为 uintptr 就绝对不是,因为 uintptr 只是一个 int,但我找不到关于 unsafe.Pointer() 的任何确定的方式可能是因为答案很明显,但我不是很确定,因为我找不到任何能准确解释它的东西。
如果我将 unsafe.Pointer 转换为其他指针类型,我认为这不会改变什么?
unsafe.Pointer 阻止收集指针对象。
此外,Golang 使用跟踪垃圾收集器,而不是引用计数。
这没有明确拼写,但可以从 https://pkg.go.dev/unsafe#Pointer
中推断出来该文档介绍了一些 unsafe.Pointer 被认为是安全的使用模式。特别是,从 T1* 到指向 T2* 的指针的转换是有效的,前提是 T2 不大于 T1 并且类型具有“等效内存布局”。
因此,从 T* 到 unsafe.Pointer 并返回到 T* 的转换是安全的,没有任何限制。如果 unsafe.Pointer 没有阻止收集引用的对象,那将是不安全的。