舉個例子: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 關注
- 125 瀏覽
添加回答
舉報
0/150
提交
取消