[問題] return by value但用 move有特殊意義嗎

作者: lovejomi (JOMI)   2019-07-31 23:04:17
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呢?
看了很不解,懷疑自己有少理解一些觀念
謝謝
作者: lovejomi (JOMI)   2019-08-01 00:41:00
https://ideone.com/gjjVLk 針對我的疑惑 做實驗但我無法解釋為什麼 不return move就會變成走copy一直認為return 是一個獨特的存在 感覺有不知道的規則.
作者: KaryuuIssen (一閃)   2019-08-01 01:33:00
就算是右值參照綁定也是左值 所以要用move轉回右值才能實現移動語義 不知道你的問題是不是這個
作者: loveme00835 (髮箍)   2019-08-01 01:52:00
zzz 希望你能有系統地學一個語言, 不是網路上東拼西湊, 然後回答了你也吸收不了
作者: lovejomi (JOMI)   2019-08-01 09:54:00
@Kar:我的問題不是這個,是一般return xxx; by value就會走move不需要刻意去std move轉型, 但為什麼這種&&的要特別用move才會變成走move呢(我知道他有名字是左值)?想了解細節 謝謝
作者: eye5002003 (下一夜)   2019-08-01 10:36:00
從boost的使用規畫去想就可以理解它在做什麼了,通常像c=a/b這種算式是不會去修改a跟b的數據,它們只參與而以,然而當你這麼寫的時候c=std::move(a)/b就是允許編譯器拿a的資源來用了,return那邊不寫move的話會建立一個新的副本,這樣使用者寫的move就失去意義了
作者: lovejomi (JOMI)   2019-08-01 10:51:00
我好像意識到 平常不寫move是因為受惠於nrvo...但這樣讓我不解 想要nrvo又inline 是怕說inline失敗還有nrvo嗎
作者: KaryuuIssen (一閃)   2019-08-01 15:13:00
上上面問題 因為&& lhs是外來的輸入引數 無法NRVO當然能inline最好 NRVO所搞的優化 inline何嘗不可
作者: hunandy14 (Charlott.HonG)   2019-08-01 17:35:00
我有注意到你更改後的把 path&& 改為 path 了改回來原本 $$ 你不用 std::move 是不合法的阿 不是你改的~沒注意看
作者: Lipraxde (Lipraxde)   2019-08-01 18:51:00
inline 不是因為它放在 header 裡嗎
作者: loveme00835 (髮箍)   2019-08-01 19:54:00
會跟 inline 混淆表示你根本不知道你在問什麼, move的作用就是轉型, 這會決定哪個版本的建構子會被叫起來, 而會不會最終會被 optimize 掉, 則是取決你的函式內容, 不是 return statement. 你每篇問題都是看到一個 feature 就問, 但是最簡單的像 move 你就理解錯誤, 其實後面也不用問了直接跟你說 C++17 以前, 談 RVO 都是 implementationdefined 所以先知道自己問題的 scope 別人才有辦法回答你
作者: ofd168 (大色狼來襲)   2019-08-08 02:18:00
推樓上好心大神

Links booklink

Contact Us: admin [ a t ] ucptt.com