返回指向数组元素的指针,这对垃圾回收有何影响?

问题描述 投票:0回答:1

假设我有一个这样的函数:

type Foo struct {
  F1 int
  F2 string
}

func ReturnMiddleElement() *Foo {
  foos = [4]Foo{Foo{F1:0,F2:"0",}, Foo{F1:1,F2:"1",}, Foo{F1:2,F2:"2",}, Foo{F1:3,F2:"3",}}

  return &(foos[2])
}

这将如何影响 GC?这会阻止整个数组被收集吗?它只会阻止收集该元素吗?考虑到这个用例,我有什么理由应该用这么小的结构来创建一个指针数组吗?

go
1个回答
0
投票

由于您持有指向数组的指针,因此该数组及其所有内容都不会被垃圾收集。这就是为什么slices.Delete将数组末尾清零

通常你不应该关心这个小内存,直到分析显示这是一个问题。虽然您可以对很多地方进行微观优化,但恕我直言,也许研究一下为什么要构建一个长时间只需要一个元素的数组会更值得。如果您只是暂时需要它,垃圾收集最终会将其作为一个整体收集。

请注意,虽然不建议,但

unsafe.Add(unsafe.Pointer(&foos[2]), unsafe.Sizeof(Foo{}))
是有效的 Go 表达式。

© www.soinside.com 2019 - 2024. All rights reserved.