举个例子: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个赞
您可以按照以下步骤进行检查:
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 程序中遵循此过程,以检查程序中是否发生任何可以避免的不必要的堆分配。
- 1 回答
- 0 关注
- 98 浏览
添加回答
举报
0/150
提交
取消