Go 使用逃逸分析和垃圾收集来管理堆栈和堆上的内存分配。Go 的常见问题解答还说:
我如何知道变量是分配在堆上还是栈上?
从正确性的角度来看,您不需要知道。只要有对它的引用,Go 中的每个变量就存在。实现选择的存储位置与语言的语义无关。
所以 Go 为变量分配内存,并至少保留它直到需要它。
我的问题是:这个(抽象)行为是用Go 编程语言规范编写的吗?我发现分配部分是写的,例如,在分配部分:
内置函数
new
采用 typeT
,在运行时为该类型的变量分配存储空间,并返回*T
指向该类型的值。
但是有没有关于预订部分的描述?我们能否确认“Go 中的每个变量只要有引用就存在”这一事实吗?如果没有,有什么原因吗?
例如,如果 Go 编译器没有错误,我想确认以下程序不得抛出 SIGSEGV 或类似异常。
func foo() *int {
x := 42
return &x
}
func main() {
px := foo()
fmt.Println(*px)
}
更准确地说,我希望“Go 在new什么时候分配内存”和“Go 至少在需要时保留分配的内存”这两部分应该写在规范中。我不关心它的实现细节,尽管https://github.com/golang/go使用了逃逸分析和垃圾回收。
如果后一部分不存在,那么在极端情况下,根据规范,内存分配后立即取消分配是有效的实现。但这很荒谬,所以我认为规范应该使这一点无效。
繁星coding
POPMUISE
LEATH
相关分类