赞
踩
在 Go 中,变量可以被分配在栈上或堆上。这两种类型的内存在根本上是不相同的,它们可以显著影响数据密集型应用程序的性能。
1. 栈 vs 堆
首先,让我们讨论一下栈和堆的区别。栈是默认内存;它是一种后进先出(LIFO)的数据结构,用于存储特定 goroutine 的所有局部变量。当一个 goroutine 启动时,它会获得 2 KB 的连续内存作为它的栈空间(这个大小随着时间的推移而变化并且可能会再次改变)。然而,这个大小在运行时不是固定的,会根据需要增大和缩小(但它在内存中始终保持连续,保持数据局部性)。
当 Go 进入一个函数时,会创建一个栈帧,代表内存中只有当前函数才能访问的一个区间。让我们看一个具体的例子来理解这个概念。在这里,main 函数将打印 sumValue 函数的结果:
- func main() {
- a := 3
- b := 2
-
- c := sumValue(a, b)
- println(c)
- }
-
- /go:noinline
- func sumValue(x, y int) int {
- z := x + y
- return z
- }
这里有两点需要注意。首先,我们使用 println 内置函数而不是 fmt.Println ,这将强制在堆上分配 c 变量。其次,我们禁用 sumValue 函数的内联,否则,函数调用将不会发生。
下图显示了分配 a 和 b 之后的栈。因为我们执行了 main 函数,所以为这个函数创建了一个栈帧。 变量 a 和 b 被分配到这
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。