登录
首页 >  Golang >  Go问答

Go 语言中内存分配的生命周期模型是否有明确规定?

来源:stackoverflow

时间:2024-03-08 19:54:26 430浏览 收藏

怎么入门Golang编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《Go 语言中内存分配的生命周期模型是否有明确规定?》,涉及到,有需要的可以收藏一下

问题内容

go 使用逃逸分析和垃圾收集来管理堆栈和堆上的内存分配。 go 的常见问题解答还指出:

如何知道变量是分配在堆上还是堆栈上? 从正确性的角度来看,您不需要知道。 go 中的每个变量只要有引用就存在。实现选择的存储位置与语言的语义无关。

因此,go 为变量分配内存,并至少保留它直到需要它为止。

我的问题是:这个(抽象)行为是 go 编程语言规范中写的吗?我发现分配部分是这样写的,例如allocation部分:

内置函数 new 采用类型 t,在运行时为该类型的变量分配存储空间,并返回指向它的 *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 使用了逃逸分析和垃圾收集。

如果后一部分不存在,那么在极端情况下,根据规范内存分配后立即取消分配是有效的实现。但这太荒谬了,所以我认为规范应该使这一点无效。

编辑结束:我认为这个问题不是基于意见的。这个问题是一个简单的是/否问题,要求规范中的描述。存在/不存在的原因可以通过引用来回答。如果没有,请表明/评论哪些观点是基于意见的。我会改进这一点。


解决方案


该规范使用术语“变量”来表示存储位置。该规范不区分堆或堆栈上的存储位置。规范中没有术语堆栈

section on variables 说:

通过引用表达式中的变量来检索变量的值;它是分配给变量的最新值。如果变量尚未赋值,则其值是其类型的零值。

如果可以引用变量,则可以检索该变量的值。当存在对变量的引用时,编译器和运行时必须保留变量的值。

语言规范中没有,没有;这是运行时的质量,而不是语言的质量。只要观察Go程序实际运行情况,我们就可以确认只要有引用,内存就不会被收集。如果该假设无效,则大多数标准库以及任何 Go 开发人员编写的几乎所有代码都将无效。 Go编译器的逃逸分析和垃圾收集器绝对有效。

您找到的常见问题解答条目是规范的,可以信赖,与规范相同。

理论要掌握,实操不能落!以上关于《Go 语言中内存分配的生命周期模型是否有明确规定?》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>