给定一个对象obj有保证吗
uintptr(unsafe.Pointer(&obj))
无论何时调用,都会计算出相同的值?
当然,Go 保证如果你使用两个指向同一个对象的指针,它们总是比较相等。不过,实现可能会移动内存中的对象并透明地更新指向它的所有指针。
如果您考虑像这样的垃圾收集策略,这会很有趣标记和压缩 https://en.wikipedia.org/wiki/Mark-compact_algorithm。实施者是否可以使用这样的垃圾收集策略?
没有这样的保证,因此可以实现移动收集器。
事实上,虽然现在垃圾收集器不移动堆对象,但在 Go 1.3 中,堆栈可以在需要增长时移动,因此完全有可能
var obj int
fmt.Println(uintptr(unsafe.Pointer(&obj)))
bigFunc()
fmt.Println(uintptr(unsafe.Pointer(&obj)))
将打印两个不同的指针,因为 bigFunc 增加了堆栈,导致 obj 和堆栈上的其他所有内容移动。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)