Re: [問題] return a local value
※ 引述《rnbjacky (你今天浪費時間了嗎?)》之銘言:
: 問題(Question):
: 請問第30行 " return obj; " 回傳local variable 值到main時
: 做了什麼事? copy ctor?
: 可以讓main好像有了一個新的物件,不會因為out of scope結果輸出錯誤值
: 感謝!!
: 程式碼(Code):(請善用置底文網頁, 記得排版)
: http://codepad.org/7SnYOmdn
正常來說你的猜測是對的
在回傳一個物件 A 時通常會用 copy constructor 複製一份成 A' 傳出來
不過你這裡的情形正好可以啟動一個稱做 RVO 的最佳化策略
RVO 全名 return value optimization
當回傳的物件是拿來給另一個物件 B 初始化時
例如像你 36 行這樣寫的時候
RVO 可以讓函式裡面對那個物件做事直接等於在外面的物件 B 上做事
這樣可以省去兩個 copy constructor 的呼叫
(一個是 A 複製成 A' 另一個是 A' 複製成 B)
那麼當 RVO 有被啟動時 str() 裡的 obj 的位址就會和 main 裡的 y 的位址相同
這就是代表 y 的位址其實被偷偷傳進去 當成 str() 裡 obj 的位址了
注意到如果你的 36 行 如果宣告和指定值分開了
像是寫成
Str y; y = str();
這樣由於前面的 Str y; 表示到那裡一個 y 要完全建構
後面的 y = str(); 就不得不使用 operator = 來指定值
這樣一來 RVO 不會啟動 裡面的 obj 就和外面的 y 是不同的兩個物件
--
1985/01/12 三嶋鳴海 1989/02/22 優希堂悟 1990/02/22 冬川こころ 1993/07/05 小町
つぐみ 歡迎來到 1994/05/21 高江ミュウ 1997/03/24 守野いづみ 1997/03/24 伊野瀬
チサト 1998/06/18 守野くるみ 打越鋼太郎的 1999/10/19 楠田ゆに 2000/02/15 樋口遙
2002/12/17 八神ココ 2011/01/11 HAL18於朱倉岳墜機 ∞與∫的世界 2011/04/02 茜崎空
啟動 2012/05/21 第貮日蝕計畫預定 2017/05/01~07 LeMU崩壞 2019/04/01~07 某大學合宿
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.28.91
→
12/24 18:10, , 1F
12/24 18:10, 1F
→
12/24 18:11, , 2F
12/24 18:11, 2F
→
12/24 18:11, , 3F
12/24 18:11, 3F
→
12/24 19:52, , 4F
12/24 19:52, 4F
→
12/24 20:10, , 5F
12/24 20:10, 5F
→
12/24 20:47, , 6F
12/24 20:47, 6F
→
12/24 21:12, , 7F
12/24 21:12, 7F
→
12/24 21:21, , 8F
12/24 21:21, 8F
→
12/24 21:22, , 9F
12/24 21:22, 9F
→
12/24 21:23, , 10F
12/24 21:23, 10F
推
12/24 21:34, , 11F
12/24 21:34, 11F
→
12/24 21:34, , 12F
12/24 21:34, 12F
→
12/24 21:56, , 13F
12/24 21:56, 13F
→
12/24 21:56, , 14F
12/24 21:56, 14F
→
12/24 21:57, , 15F
12/24 21:57, 15F
→
12/24 22:13, , 16F
12/24 22:13, 16F
→
12/24 22:13, , 17F
12/24 22:13, 17F
→
12/24 22:13, , 18F
12/24 22:13, 18F
→
12/24 22:21, , 19F
12/24 22:21, 19F
→
12/24 22:30, , 20F
12/24 22:30, 20F
→
12/24 22:30, , 21F
12/24 22:30, 21F
→
12/24 22:31, , 22F
12/24 22:31, 22F
→
12/24 22:32, , 23F
12/24 22:32, 23F
→
12/24 22:41, , 24F
12/24 22:41, 24F
→
12/24 22:43, , 25F
12/24 22:43, 25F
→
12/24 22:43, , 26F
12/24 22:43, 26F
→
12/24 22:51, , 27F
12/24 22:51, 27F
→
12/24 22:51, , 28F
12/24 22:51, 28F
→
12/24 22:51, , 29F
12/24 22:51, 29F
→
12/24 22:55, , 30F
12/24 22:55, 30F
→
12/24 22:55, , 31F
12/24 22:55, 31F
→
12/24 23:05, , 32F
12/24 23:05, 32F
推
12/25 00:07, , 33F
12/25 00:07, 33F
→
12/25 00:08, , 34F
12/25 00:08, 34F
→
12/25 00:11, , 35F
12/25 00:11, 35F
推
12/25 02:01, , 36F
12/25 02:01, 36F
→
12/25 02:01, , 37F
12/25 02:01, 37F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):