Go和C ++之间的指针差异,gc之后指针会改变吗?

时间:2019-05-20 10:43:46

标签: pointers go memory-management

Go和C ++中的指针工作方式是否有所不同,gc之后指针会改变吗?

我想知道Go中指针与内存之间的具体关系。如果您有相关信息或源代码说明,非常感谢。

1 个答案:

答案 0 :(得分:0)

语言规范没有说明指针是否应保持不变。这意味着您不应该依赖于此。

您可以保证的是,如果指针在垃圾回收周期后发生更改,或者如果运行时由于内存分配/释放而更改了指针,则变量中的指针将被更新以反映更改。

unsafe.Pointer文档中有一个提示,其指针可能可能会更改:

  

uintptr是整数,而不是引用。将Pointer转换为uintptr会创建一个没有指针语义的整数值。即使uintptr保留了某个对象的地址,如果对象移动,垃圾收集器也不会更新该uintptr的值,也不会使uintptr阻止回收该对象。

在实践中,垃圾收集器不会一直到处移动并更改指针,这将是不必要的开销。但是,如果释放了许多对象并压缩了内存,或者存在“压力”以释放未使用的内存(例如,由于调用了debug.FreeOSMemory()),它可能会重新排序内存中的对象。