例如,我有一个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 })
}
Item
和Item2
哪个内存更好?Golang如何在Item.getPriority中存储函数,这些都指向同一个内存地址吗?
注意:由于一些抽象的原因,我不能使用struct方法:
func (r Item[T]) getPriority() {}
1条答案
按热度按时间fwzugrvs1#
对于内存使用:
getPriority func(item Item[T]) int
是一个函数,被存储为指针参考上面代码中的函数=>指针在32/64位系统上占用4/8字节priority int
是一个int,=> int在32/64位系统上占用4/8字节因此,就内存而言,上述两种方法是相等的。
另一方面,应该使用函数方法,因为它使用
item.data
作为唯一的真理来源。