Go语言 Getter函数与重复值在内存使用方面的区别?

mnemlml8  于 2023-09-28  发布在  Go
关注(0)|答案(1)|浏览(73)

例如,我有一个Item数组:

// approach 1: Getter function
type Item[T any] struct {
  data T,
  getPriority func(item Item[T]) int // get priority from data
}

// approach 2: Duplicate data
type Item2[T any] struct {
  data T,
  priority int, // get priority from data
}

a := []*Item[int] { ... }
a2 := []*Item2[int] { ... }

如果a有1M个这样的项目:

getPriority := func(item Item[int]) int {
  return item.data
}
for i:=1; i<1e6; i++ {
  a = append(a, Item[int]{i, getPriority })
  a2 = append(a2, Item2[int]{i, i })
}

ItemItem2哪个内存更好?Golang如何在Item.getPriority中存储函数,这些都指向同一个内存地址吗?
注意:由于一些抽象的原因,我不能使用struct方法:

func (r Item[T]) getPriority()  {}
fwzugrvs

fwzugrvs1#

对于内存使用:

  • getPriority func(item Item[T]) int是一个函数,被存储为指针参考上面代码中的函数=>指针在32/64位系统上占用4/8字节
  • priority int是一个int,=> int在32/64位系统上占用4/8字节

因此,就内存而言,上述两种方法是相等的。
另一方面,应该使用函数方法,因为它使用item.data作为唯一的真理来源。

相关问题