舉個(gè)例子: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返回一個(gè)指針,我知道該對(duì)象保存在堆中,并fff接收指向同一堆分配對(duì)象的指針?,F(xiàn)在,第二個(gè)實(shí)現(xiàn)NewFoo不會(huì)返回指針,Go 會(huì)返回堆棧分配結(jié)構(gòu)的副本,還是會(huì)發(fā)生類(lèi)似C++ 的 RVO 的情況?
1 回答

慕工程0101907
TA貢獻(xiàn)1887條經(jīng)驗(yàn) 獲得超5個(gè)贊
您可以按照以下步驟進(jìn)行檢查:
main.go
將程序?qū)懭脒@樣的文件中:?https ://play.golang.org/p/iwxai0EHa40執(zhí)行命令
go build -gcflags=-m main.go
查看輸出以真正了解它是否被復(fù)制/內(nèi)聯(lián)。就我而言,我得到的輸出是:
#?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 程序中遵循此過(guò)程,以檢查程序中是否發(fā)生任何可以避免的不必要的堆分配。
- 1 回答
- 0 關(guān)注
- 123 瀏覽
添加回答
舉報(bào)
0/150
提交
取消