gc Go如何处理堆分配?

时间:2019-01-11 19:16:03

标签: go

gc Go(特别是go1.11)是否预分配了一块内存,并为每次分配(例如JVM)从中获取内存,还是每次创建变量时都对其进行分配,这是否是内核调用(malloc)? ?

如果每个分配只有一个内核调用,这将使变量创建变得昂贵。如何在堆栈/堆上强制分配?

1 个答案:

答案 0 :(得分:1)

这涵盖了各个地方,例如the FAQ

  

我如何知道在堆还是堆栈上分配了变量?

     

从正确性的角度来看,您不需要知道。每个变量   只要有引用,Go中就存在。存储空间   实现选择的位置与语义无关   语言。

     

存储位置确实会影响写入效率   程式。如果可能,Go编译器将分配变量   对于该函数的堆栈框架中的某个函数而言是本地的。但是,如果   编译器无法证明之后没有引用该变量   函数返回,则编译器必须在   垃圾回收堆,以避免悬空的指针错误。另外,如果   局部变量很大,将其存储可能更有意义   在堆而不是堆栈上。

     

在当前的编译器中,如果使用了变量的地址,则表示   变量是在堆上分配的候选对象。但是,基本   转义分析可以识别某些情况,而这些变量不会   活在函数的返回值之后,并且可以驻留在堆栈中。


Go的内存分配已根据其需要进行了仔细优化,例如使用custom malloc。我怀疑您遇到的是一个稍有不同的基本问题/问题-最好问一下。如果只是出于探索/好奇心,您必须使问题更加具体。