go1.4中是否需要放弃栈上过大的变量以避免栈复制?

我们知道,goroutine 的堆栈可以通过复制 go1.4 中的堆栈来增加。我的问题是,是否有必要在 go 中避免堆栈上的局部变量过大?例如


func foo(){

   var buf [8096]int

   //do something with buf

}

或者


var buf [8096]int

func foo(){      

   //do something with buf

}

我的意思是,是否有必要使用后一个示例来避免由于堆栈复制而导致的大变量?


人到中年有点甜
浏览 154回答 2
2回答

千万里不及你

堆栈几乎总是比堆快。在哪里定义变量更多的是关于范围。由于 Go 是后一个示例中的词法范围语言,因此您弄脏了全局命名空间,使 var buf 在程序中的任何地方都可见。这是语义差异。所以你最好在语义上做正确的事情。

GCT1015

如果您不想在堆栈中重新分配另一个大对象,您应该使用指针而不是全局变量。至于 go1.4,这段代码有效:package mainimport "fmt"func do(v *[3]int) {    v[1] = 99}func main() {    var r [3]int    do(&r)    fmt.Println(r)    //Prints [0 99 0]}如果你不使用指针,这将失败,因为数组作为值传递,而不是引用:package mainimport "fmt"func do(v [3]int) {    v[1] = 99}func main() {    var r [3]int    do(r)    fmt.Println(r)    //Prints [0 0 0]}注意:这不适用于切片;切片总是作为参考传递。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go