作者lovejomi (JOMI)
看板C_and_CPP
標題[問題] return by value但用 move有特殊意義嗎
時間Wed Jul 31 23:04:17 2019
https://github.com/boostorg/filesystem/commit/701ae4054947b1643eb6cd42f7e172f8
3536b764
因緣際會看到這個patch
他這樣寫 刻意用 std move 擺在return
但書本上或是網路上查到的都是說
不要這樣寫 會限制最佳化的發揮空間
但他是boost ,我就想說是不是有什麼特殊考量
相較他 const lhs 版本 ,return local變數 就沒特別寫 move
難道參數型態是 &&,return若沒move就會走copy(我想沒這個限制才對)
所以想知道 到底什麼時候要刻意加上move在return value上
另外對於他特別寫inline
1. 他實作是寫在class內,應該不用特別寫inline...有什麼背後原因嗎?
2. inline 跟 rvo感覺就有點互斥,為什麼他要特別寫inline呢?
看了很不解,懷疑自己有少理解一些觀念
謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 39.12.8.46 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1564585460.A.073.html
2F:→ lovejomi: 但我無法解釋為什麼 不return move就會變成走copy 08/01 00:41
3F:→ lovejomi: 一直認為return 是一個獨特的存在 感覺有不知道的規則. 08/01 00:46
4F:推 KaryuuIssen: 就算是右值參照綁定也是左值 所以要用move轉回右值 08/01 01:33
5F:→ KaryuuIssen: 才能實現移動語義 不知道你的問題是不是這個 08/01 01:33
6F:→ loveme00835: zzz 希望你能有系統地學一個語言, 不是網路上東拼西 08/01 01:52
7F:→ loveme00835: 湊, 然後回答了你也吸收不了 08/01 01:52
8F:→ lovejomi: @Kar:我的問題不是這個,是一般return xxx; by value就 08/01 09:54
9F:→ lovejomi: 會走move不需要刻意去std move轉型, 但為什麼這種&&的要 08/01 09:54
10F:→ lovejomi: 特別用move才會變成走move呢(我知道他有名字是左值)? 08/01 09:54
11F:→ lovejomi: 想了解細節 謝謝 08/01 09:54
12F:推 eye5002003: 從boost的使用規畫去想就可以理解它在做什麼了,通常 08/01 10:36
13F:→ eye5002003: 像c=a/b這種算式是不會去修改a跟b的數據,它們只參與而 08/01 10:38
14F:→ eye5002003: 以,然而當你這麼寫的時候c=std::move(a)/b就是允許編 08/01 10:40
15F:→ eye5002003: 譯器拿a的資源來用了,return那邊不寫move的話會建立一 08/01 10:44
16F:→ eye5002003: 個新的副本,這樣使用者寫的move就失去意義了 08/01 10:46
17F:→ lovejomi: 我好像意識到 平常不寫move是因為受惠於nrvo...但這樣 08/01 10:51
18F:→ lovejomi: 讓我不解 想要nrvo又inline 是怕說inline失敗還有nrvo 08/01 10:51
19F:→ lovejomi: 嗎 08/01 10:51
20F:推 KaryuuIssen: 上上面問題 因為&& lhs是外來的輸入引數 無法NRVO 08/01 15:13
21F:→ KaryuuIssen: 當然能inline最好 NRVO所搞的優化 inline何嘗不可 08/01 15:14
22F:→ hunandy14: 我有注意到你更改後的把 path&& 改為 path 了 08/01 17:35
23F:→ hunandy14: 改回來原本 $$ 你不用 std::move 是不合法的 08/01 17:36
24F:→ hunandy14: 阿 不是你改的~沒注意看 08/01 17:39
25F:→ Lipraxde: inline 不是因為它放在 header 裡嗎 08/01 18:51
26F:→ loveme00835: 會跟 inline 混淆表示你根本不知道你在問什麼, move 08/01 19:54
27F:→ loveme00835: 的作用就是轉型, 這會決定哪個版本的建構子會被叫起 08/01 19:54
28F:→ loveme00835: 來, 而會不會最終會被 optimize 掉, 則是取決你的函 08/01 19:54
29F:→ loveme00835: 式內容, 不是 return statement. 你每篇問題都是看到 08/01 19:54
30F:→ loveme00835: 一個 feature 就問, 但是最簡單的像 move 你就理解錯 08/01 19:54
31F:→ loveme00835: 誤, 其實後面也不用問了 08/01 19:54
32F:→ loveme00835: 直接跟你說 C++17 以前, 談 RVO 都是 implementation 08/01 19:55
33F:→ loveme00835: defined 所以先知道自己問題的 scope 別人才有辦法 08/01 19:55
34F:→ loveme00835: 回答你 08/01 19:55
35F:推 ofd168: 推樓上好心大神 08/08 02:18