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

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

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

Go
眼眸繁星 2023-07-26 17:18:39
举个例子: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 的情况?
查看完整描述

1 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

您可以按照以下步骤进行检查:

  1. main.go将程序写入这样的文件中: https ://play.golang.org/p/iwxai0EHa40

  2. 执行命令go build -gcflags=-m main.go

  3. 查看输出以真正了解它是否被复制/内联。就我而言,我得到的输出是:

# 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 程序中遵循此过程,以检查程序中是否发生任何可以避免的不必要的堆分配。

查看完整回答
反对 回复 2023-07-26
  • 1 回答
  • 0 关注
  • 98 浏览
慕课专栏
更多

添加回答

举报

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