在许多编程语言中,局部变量都位于调用堆栈中。
在 JavaScript/Python 中,只有闭包变量位于堆中,因为它们必须存在于函数调用之外,才能被创建。
在 GO 中,一些 GO 类型(例如切片类型 []int)确实引用了内存的其他部分,就像 JavaScript/Python 一样。
在 GO 中,并非所有类型的变量都保存引用,就像 Javascript/Python 一样。
例如,
1) [3]int 类型变量 b 直接存储 int 数组,类似于 C,不同的是 C 允许使用 C 语法 &b[index] 访问每个数组元素位置,以获得更多控制。
2) int 类型变量 c 直接存储 int 值,类似于 C,不同的是,C 提供语法(&c)来获取位置访问权限。
在 GO 中,我理解局部变量是否位于堆/栈上取决于应用编译器的逃逸分析,在下面的示例代码中。
在 JavaScript/Python 中,只有闭包变量位于堆中,因为它们必须存在于函数调用之外,才能被创建。
在 GO 中,一些 GO 类型(例如切片类型 []int)确实引用了内存的其他部分,就像 JavaScript/Python 一样。
在 GO 中,并非所有类型的变量都保存引用,就像 Javascript/Python 一样。
例如,
1) [3]int 类型变量 b 直接存储 int 数组,类似于 C,不同的是 C 允许使用 C 语法 &b[index] 访问每个数组元素位置,以获得更多控制。
2) int 类型变量 c 直接存储 int 值,类似于 C,不同的是,C 提供语法(&c)来获取位置访问权限。
在 GO 中,我理解局部变量是否位于堆/栈上取决于应用编译器的逃逸分析,在下面的示例代码中。
func foo() []int {
// the array lives beyond the call to foo in which it is created
var a [5]int
return a[:] // range operator
}
这告诉编译器变量 a
的生命周期超出其作用域,因此在堆上分配内存,而不是在栈上。
问题:
变量 a
是否在堆上分配内存?