为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
人到中年有点甜 2021-09-10 15:25:37
我们知道,goroutine 的堆栈可以通过复制 go1.4 中的堆栈来增加。我的问题是,是否有必要在 go 中避免堆栈上的局部变量过大?例如func foo(){   var buf [8096]int   //do something with buf}或者var buf [8096]intfunc foo(){         //do something with buf}我的意思是,是否有必要使用后一个示例来避免由于堆栈复制而导致的大变量?
查看完整描述

2 回答

?
千万里不及你

TA贡献1784条经验 获得超9个赞

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


查看完整回答
反对 回复 2021-09-10
?
GCT1015

TA贡献1827条经验 获得超4个赞

如果您不想在堆栈中重新分配另一个大对象,您应该使用指针而不是全局变量。至于 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]

}

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


查看完整回答
反对 回复 2021-09-10
  • 2 回答
  • 0 关注
  • 153 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信