如果我按值而不是指针返回,Go 会复制我的结构吗?

举个例子:


type Foo struct {

    num int

}


// func NewFoo() *Foo { // returning a pointer

//     return &Foo{33}

// }


func NewFoo() Foo { // NOT returning a pointer

    return Foo{33}

}


func main() {

    fff := NewFoo()

    fmt.Printf("%d\n", fff.num)

}

如果NewFoo返回一个指针,我知道该对象保存在堆中,并fff接收指向同一堆分配对象的指针。

现在,第二个实现NewFoo不会返回指针,Go 会返回堆栈分配结构的副本,还是会发生类似C++ 的 RVO 的情况?


眼眸繁星
浏览 107回答 1
1回答

慕工程0101907

您可以按照以下步骤进行检查:main.go将程序写入这样的文件中: https ://play.golang.org/p/iwxai0EHa40执行命令go build -gcflags=-m main.go查看输出以真正了解它是否被复制/内联。就我而言,我得到的输出是:# command-line-arguments ./main.go:13:6: can inline NewFoo ./main.go:17:6: can inline main ./main.go:18:15: inlining call to NewFoo ./main.go:19:12: inlining call to fmt.Printf ./main.go:19:24: fff.num escapes to heap ./main.go:19:12: io.Writer(os.Stdout) escapes to heap ./main.go:19:12: main []interface {} literal does not escape <autogenerated>:1: os.(*File).close .this does not escape您可以在任何 Go 程序中遵循此过程,以检查程序中是否发生任何可以避免的不必要的堆分配。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go