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

看板C_and_CPP (C/C++)作者 (JOMI)時間6年前 (2019/07/31 23:04), 編輯推噓4(4031)
留言35則, 7人參與, 6年前最新討論串1/1
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://www.ptt.cc/bbs/C_and_CPP/M.1564585460.A.073.html

08/01 00:41, 6年前 , 1F
https://ideone.com/gjjVLk 針對我的疑惑 做實驗
08/01 00:41, 1F

08/01 00:41, 6年前 , 2F
但我無法解釋為什麼 不return move就會變成走copy
08/01 00:41, 2F

08/01 00:46, 6年前 , 3F
一直認為return 是一個獨特的存在 感覺有不知道的規則.
08/01 00:46, 3F

08/01 01:33, 6年前 , 4F
就算是右值參照綁定也是左值 所以要用move轉回右值
08/01 01:33, 4F

08/01 01:33, 6年前 , 5F
才能實現移動語義 不知道你的問題是不是這個
08/01 01:33, 5F

08/01 01:52, 6年前 , 6F
zzz 希望你能有系統地學一個語言, 不是網路上東拼西
08/01 01:52, 6F

08/01 01:52, 6年前 , 7F
湊, 然後回答了你也吸收不了
08/01 01:52, 7F

08/01 09:54, 6年前 , 8F
@Kar:我的問題不是這個,是一般return xxx; by value就
08/01 09:54, 8F

08/01 09:54, 6年前 , 9F
會走move不需要刻意去std move轉型, 但為什麼這種&&的要
08/01 09:54, 9F

08/01 09:54, 6年前 , 10F
特別用move才會變成走move呢(我知道他有名字是左值)?
08/01 09:54, 10F

08/01 09:54, 6年前 , 11F
想了解細節 謝謝
08/01 09:54, 11F

08/01 10:36, 6年前 , 12F
從boost的使用規畫去想就可以理解它在做什麼了,通常
08/01 10:36, 12F

08/01 10:38, 6年前 , 13F
像c=a/b這種算式是不會去修改a跟b的數據,它們只參與而
08/01 10:38, 13F

08/01 10:40, 6年前 , 14F
以,然而當你這麼寫的時候c=std::move(a)/b就是允許編
08/01 10:40, 14F

08/01 10:44, 6年前 , 15F
譯器拿a的資源來用了,return那邊不寫move的話會建立一
08/01 10:44, 15F

08/01 10:46, 6年前 , 16F
個新的副本,這樣使用者寫的move就失去意義了
08/01 10:46, 16F

08/01 10:51, 6年前 , 17F
我好像意識到 平常不寫move是因為受惠於nrvo...但這樣
08/01 10:51, 17F

08/01 10:51, 6年前 , 18F
讓我不解 想要nrvo又inline 是怕說inline失敗還有nrvo
08/01 10:51, 18F

08/01 10:51, 6年前 , 19F
08/01 10:51, 19F

08/01 15:13, 6年前 , 20F
上上面問題 因為&& lhs是外來的輸入引數 無法NRVO
08/01 15:13, 20F

08/01 15:14, 6年前 , 21F
當然能inline最好 NRVO所搞的優化 inline何嘗不可
08/01 15:14, 21F

08/01 17:35, 6年前 , 22F
我有注意到你更改後的把 path&& 改為 path 了
08/01 17:35, 22F

08/01 17:36, 6年前 , 23F
改回來原本 $$ 你不用 std::move 是不合法的
08/01 17:36, 23F

08/01 17:39, 6年前 , 24F
阿 不是你改的~沒注意看
08/01 17:39, 24F

08/01 18:51, 6年前 , 25F
inline 不是因為它放在 header 裡嗎
08/01 18:51, 25F

08/01 19:54, 6年前 , 26F
會跟 inline 混淆表示你根本不知道你在問什麼, move
08/01 19:54, 26F

08/01 19:54, 6年前 , 27F
的作用就是轉型, 這會決定哪個版本的建構子會被叫起
08/01 19:54, 27F

08/01 19:54, 6年前 , 28F
來, 而會不會最終會被 optimize 掉, 則是取決你的函
08/01 19:54, 28F

08/01 19:54, 6年前 , 29F
式內容, 不是 return statement. 你每篇問題都是看到
08/01 19:54, 29F

08/01 19:54, 6年前 , 30F
一個 feature 就問, 但是最簡單的像 move 你就理解錯
08/01 19:54, 30F

08/01 19:54, 6年前 , 31F
誤, 其實後面也不用問了
08/01 19:54, 31F

08/01 19:55, 6年前 , 32F
直接跟你說 C++17 以前, 談 RVO 都是 implementation
08/01 19:55, 32F

08/01 19:55, 6年前 , 33F
defined 所以先知道自己問題的 scope 別人才有辦法
08/01 19:55, 33F

08/01 19:55, 6年前 , 34F
回答你
08/01 19:55, 34F

08/08 02:18, 6年前 , 35F
推樓上好心大神
08/08 02:18, 35F
文章代碼(AID): #1TGQtq1p (C_and_CPP)
文章代碼(AID): #1TGQtq1p (C_and_CPP)