繁体   English   中英

指向结构成员的指针如何使结构在 Go 中保持活动状态

[英]how a pointer to a struct member keeps the struct alive in Go

给定以下 golang 代码:

type Pointer struct { x, y int }

func foo(p *Pointer) *int {
    return &p.y
}

CompilerExplorer显示return &p.y编译为

TESTB   AL, (AX)
ADDQ    $8, AX
RET

这很容易理解。 TESTB是一个空检查,然后ADDQ通过将Pointer::y的偏移量添加到p来生成指向py的指针。

我不明白的是,给定一个指向py的指针,垃圾收集器如何知道它不仅仅是一个任意的*int ,而是一个指向Pointer::y的指针,所以只要指向py的指针p就必须保持活动状态还活着?

阅读源代码后,我找到了答案。

  1. 去使用基于竞技场/跨度的分配。
  2. Arenas 和 spans 与页面对齐,因此计算指针指向的 arena 很简单。
  3. 有一个全局向量存储所有竞技场和跨度的元数据。
  4. 每个跨度都有一个固定的“元素大小”。 同一跨度中的所有对象具有相同的大小。
  5. 给定指针p 、 span b的基地址和 span s元素大小,我们知道指针指向 span 中的第 n 个元素,其中n = (p - b) / s
  6. 所以跨度b + s * n中第 n 个对象的地址,需要标记为活动的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM