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

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

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

【问题讨论】:

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

标签: pointers go memory-management


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    相关资源
    最近更新 更多