Go和C++的指针区别,gc后指针会变吗?

Posted

技术标签:

【中文标题】Go和C++的指针区别,gc后指针会变吗?【英文标题】:Pointer difference between Go and C++, will pointer change after gc? 【发布时间】:2019-10-06 17:24:45 【问题描述】:

Go 和 C++ 中指针的工作方式有区别吗,gc 后指针会改变吗?

我想知道Go中指针和内存的具体关系。如有相关资料或源码说明,万分感谢。

【问题讨论】:

我可以解释这一点。 “[T][Go] 中指针和内存之间的特定关系”是。指针是内存地址。 啊,对不起,我忘了回答标题中的问题:没有。 也许@jimmy 看起来像this? :) 感兴趣? pointers 和 unsafe. 在c++中指针总是指向一个内存地址,但是在golang中,GC可能会重新组织内存。发生这种情况后指针会改变吗? 【参考方案1】:

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

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

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

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

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

【讨论】:

以上是关于Go和C++的指针区别,gc后指针会变吗?的主要内容,如果未能解决你的问题,请参考以下文章

go语言-interface的值接收和指针接受的区别

go语言-interface的值接收和指针接受的区别

go语言-interface的值接收和指针接受的区别

go 方法接受者 是指针类型和非指针类型的 区别

GO 一文搞懂指针和地址值的区别

Go语言:指针和unsafe.Pointer有什么区别?