gpt4 book ai didi

go - Go 类型的方法集在内存中是如何分配的?

转载 作者:IT王子 更新时间:2023-10-29 02:26:37 24 4
gpt4 key购买 nike

C++ 避免在每次创建实例时都为类方法分配内存。我的直觉是假设 Go 也减少了这种重复。只是确认一下,Go 是否只存储一次自定义结构的方法集?

type Custom struct {
value string
}

func (c Custom) TurnItUp() {
c.value = "up"
}

func (c Custom) TurnItDown() {
c.value = "down"
}

... // Many more methods defined for Custom.
// (Positive and negative directions in 100 dimensions)

func main() {
var many []Custom
fmt.Println("Memory: ", foo.memory()) // Measure memory used.
for i := 0; i < 10000; i++ {
append(many, Custom{value: "nowhere"})
}
fmt.Println("Memory: ", foo.memory()) // Measure memory used.
}

最佳答案

当具体类型分配给接口(interface)类型时,运行时分配一个itable。具体类型和接口(interface)类型的 itable 被缓存并用于以后的分配。

例如,此代码将分配一个 itable:

type Volume interface {
TurnItUp()
TurnItDown()
}
var many []Volume
for i := 0; i < 10000; i++ {
many = append(many, Custom{value: "nowhere"})
}

此代码将分配两个 itable,一个用于 (Custom, Upper),一个用于 (Custom, Downer):

type Upper interface {
TurnItUp()
}
type Downer interface {
TurnItDown()
}
var uppers []Upper
var downers []Downer
for i := 0; i < 10000; i++ {
uppers = append(uppers, Custom{value: "nowhere"})
downers = append(downers, Custom{value: "nowhere"})
}

因为问题中的示例没有为接口(interface)分配自定义值,所以没有创建 itables。

运行时使用静态元数据数据来构造 itables。静态数据分配并初始化一次。

参见 Go Data Structures: Interfaces了解更多详情。

关于go - Go 类型的方法集在内存中是如何分配的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31397094/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com