是否有必要放弃堆栈上太大的变量以避免在go1.4中进行堆栈复制?

时间:2014-12-26 02:30:06

标签: go

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

func foo(){
   var buf [8096]int
   //do something with buf
}

var buf [8096]int
func foo(){      
   //do something with buf
}

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

如果您不想在堆栈中重新分配另一个大对象,则应使用指针而不是全局变量。至于go1.4,这段代码有效:

package main

import "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 main

import "fmt"

func do(v [3]int) {
    v[1] = 99
}

func main() {
    var r [3]int
    do(r)
    fmt.Println(r)
    //Prints [0 0 0]
}

注意:这不适用于切片;切片总是作为参考传递。