登录
首页 >  Golang >  Go问答

Golang 中返回函数时的内存分配是多少?

来源:stackoverflow

时间:2024-05-01 17:36:37 439浏览 收藏

学习Golang要努力,但是不要急!今天的这篇文章《Golang 中返回函数时的内存分配是多少?》将会介绍到等等知识点,如果你想深入学习Golang,可以关注我!我会持续更新相关文章的,希望对大家都能有所帮助!

问题内容

这是一个简化的代码

func MyHandler(a int) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        w.WriteCode(a)
    })
}

每当一个http请求到来时,myhandler就会被调用,并且它将返回一个用于处理该请求的函数。因此,每当一个 http 请求到来时,就会创建一个新的函数对象。 go 中将函数视为第一类。我试图从内存的角度理解当您返回函数时实际发生的情况。当你返回一个值时,例如一个整数,它将在堆栈中占用 4 个字节。那么返回一个函数以及函数体内的很多东西怎么样?这是一种有效的方法吗?有什么缺点吗?


正确答案


如果您不习惯闭包,它们可能看起来有点神奇。然而,它们很容易在编译器中实现:

  • 编译器找到必须由闭包捕获的任何变量。它将它们放入一个工作区域中,只要闭包本身存在,该工作区域将被分配并保持分配状态。

  • 然后编译器会生成带有秘密额外参数或其他运行时技巧的内部函数,1这样调用该函数就会激活闭包。

因为返回的函数通过编译时安排访问其闭包变量,所以没有什么特别需要的。由于 Go 是一种垃圾收集语言,因此也不需要其他任何东西:指向闭包的指针使闭包数据保持活动状态,直到指针消失,因为该函数无法再被调用,此时闭包数据消失了(好吧,在下一次 GC 时)。

1GCC 有时使用trampolines 来为 C 执行此操作,其中trampolines 是在运行时生成的可执行代码。可执行代码可以设置寄存器或传递额外参数等。这可能会很昂贵,因为在运行时被视为数据的某些东西(生成的代码)必须在运行时转换为可执行代码(可能需要系统调用,并且可能需要某些监督代码“审查”生成的运行时代码)。

Go 不需要任何这些,因为该语言是在定义时考虑到闭包的,因此实现者不会,呃,“关闭”任何简单的方法来使这一切正常工作。一些运行时 ABI 也在定义时考虑了闭包,例如,寄存器 r1 被保留为所有函数指针类型或某些此类类型中的闭包变量指针。

以上就是《Golang 中返回函数时的内存分配是多少?》的详细内容,更多关于的资料请关注golang学习网公众号!

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