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