编程语言在内存中分配对象,不同的语言使用不同的策略来做到这一点。在 C 中,堆栈分配的变量驻留在堆栈上,而堆分配的内存是动态分配的。另一方面,Python 在堆上分配所有对象,使用引用来访问它们。
Go 的内存分配方法不同于 C 和 Python。虽然 Go 没有明确指定对象的分配位置,但它使用垃圾收集来回收未使用的内存。这就提出了关于结构体(复合类型)在 Go 中如何分配的问题。
考虑以下两个函数,它们似乎执行相同的任务:
func myFunction() (*MyStructType, error) { var chunk *MyStructType = new(HeaderChunk) ... return chunk, nil } func myFunction() (*MyStructType, error) { var chunk MyStructType ... return &chunk, nil }
这些示例函数提出了几个问题问题:
在 Go 中,堆栈用于存储函数参数、局部变量和返回值。堆用于分配使用 new 创建的对象或已逃逸堆栈的对象。
在第一个函数中,使用 new 在堆上分配 chunk。在第二个函数中,Go 的逃逸分析确定 &chunk 逃逸了堆栈,因此它也分配在堆上。
尽管 chunk 分配在堆栈上第二个函数,Go 的垃圾收集器确保它在函数返回后仍然可访问。这是因为逃逸分析确定 chunk 逃逸了函数作用域,只要它被另一个对象引用,垃圾收集器就不会回收它。
结构体传递在 Go 中按值排序,因为它们是复合类型。相反,传递指针将允许被调用者修改原始结构。对于第二个函数,块是在堆上分配的,因此不需要向它传递指针。但是,当调用者需要访问已在堆上分配的结构时,将使用指针。
以上是Go 如何处理结构体的堆栈分配与堆分配,以及垃圾收集发挥什么作用?的详细内容。更多信息请关注PHP中文网其他相关文章!