gc Go(特别是go1.11)是否预分配了一块内存,并为每次分配(例如JVM)从中获取内存,还是每次创建变量时都对其进行分配,这是否是内核调用(malloc)? ?
如果每个分配只有一个内核调用,这将使变量创建变得昂贵。如何在堆栈/堆上强制分配?
答案 0 :(得分:1)
这涵盖了各个地方,例如the FAQ:
我如何知道在堆还是堆栈上分配了变量?
从正确性的角度来看,您不需要知道。每个变量 只要有引用,Go中就存在。存储空间 实现选择的位置与语义无关 语言。
存储位置确实会影响写入效率 程式。如果可能,Go编译器将分配变量 对于该函数的堆栈框架中的某个函数而言是本地的。但是,如果 编译器无法证明之后没有引用该变量 函数返回,则编译器必须在 垃圾回收堆,以避免悬空的指针错误。另外,如果 局部变量很大,将其存储可能更有意义 在堆而不是堆栈上。
在当前的编译器中,如果使用了变量的地址,则表示 变量是在堆上分配的候选对象。但是,基本 转义分析可以识别某些情况,而这些变量不会 活在函数的返回值之后,并且可以驻留在堆栈中。
Go的内存分配已根据其需要进行了仔细优化,例如使用custom malloc。我怀疑您遇到的是一个稍有不同的基本问题/问题-最好问一下。如果只是出于探索/好奇心,您必须使问题更加具体。