[問題] 關於Rvalue與RVO

看板C_and_CPP (C/C++)作者 (鳳凰)時間4年前 (2021/04/09 17:18), 4年前編輯推噓3(3022)
留言25則, 8人參與, 4年前最新討論串1/1
------ #先說明,回傳時通常傳參考就沒這些問題,故意這樣寫只是想搞懂 現在覺得C++好難= =,腦袋已經混亂了,求指點明晰 ------ 最近學到move constructor以後,看了看Rvalue的定義,試了下code, 發現VC++與G++的行為不同,下面有我寫的簡單的code,希望能得到解 答,如果不好回答,希望能有連結或關鍵字讓我查詢。 我猜可能是function return object沒學好,先舉例說明我的想法: class A{ A& append(int value){ //...append value to A return *this; } A(const A& a){ //...copy a to *this } } A a; A b = a.append(1); 以上面這行來說,會有兩個動作 1.使用a.append(1)時的return, A& temp = *this; 2.使用b.A(const A& a)時, const A& a = temp; 如果對的話往下看才有意義,我下面的傳參數 都是靠這個邏輯傳的。 接下來看code: https://pastebin.com/rx9xuAa3 附上VC++與G++的截圖結果。 左邊是VisualStudio2019,右邊是G++7.2.0。 https://i.imgur.com/6pn0XzZ.png
以這個例子來說,我覺得兩者output都不對= =" 我認為的答案如下: Constructor a //A b(objName); Deep copy when initial. //A temp = b; return時 Destructor a //出copy()時,解構a ------------------------------------ Constructor b //A b(objName); Shadow copy when initial.//A temp = b; RVO的關係,改成move Deep copy when initial. //A c(temp); 用C來初始化建構 ------------------------------------ //main結束時全部解構 Destructor default //因為我複製時沒改到_objName,預設 Destructor a //最上面的a -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.163.83.72 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1617959898.A.4D0.html ※ 編輯: DeepFapping (118.163.83.72 臺灣), 04/09/2021 17:19:36

04/09 17:30, 4年前 , 1F
是不是還有Copy elision要考慮,我現在沒辦法測試
04/09 17:30, 1F

04/09 17:47, 4年前 , 2F
臥槽,剛查了一下,我沒學過這東西,所以這是編譯器
04/09 17:47, 2F

04/09 17:47, 4年前 , 3F
優化的問題,設中斷點也看不到的結果,不知遇到這種
04/09 17:47, 3F

04/09 17:47, 4年前 , 4F
問題要如何學習?感謝。以試過,g++結果跟Visual C
04/09 17:47, 4F

04/09 17:47, 4年前 , 5F
++一樣了,但是仍然跟我想的不一樣= ="
04/09 17:47, 5F

04/09 18:08, 4年前 , 6F
先從怎麼把所有相關的優化關掉開始學
04/09 18:08, 6F

04/09 18:29, 4年前 , 7F
左邊的啊
04/09 18:29, 7F

04/10 06:30, 4年前 , 8F
樓樓上說的關掉優化在c++17後應該也沒用了 有些rvo變成
04/10 06:30, 8F

04/10 06:30, 4年前 , 9F
強制的 規則可以在cppreference翻一下
04/10 06:30, 9F

04/10 06:31, 4年前 , 10F
抱歉 應該說 copy elision 比較準確
04/10 06:31, 10F

04/10 13:53, 4年前 , 11F
是嗎?我有點忘記以前試的時候是不是用 c++17 了。
04/10 13:53, 11F

04/10 19:24, 4年前 , 12F
Copy Elision或RVO發生的時候根本連Move都不會有
04/10 19:24, 12F

04/10 19:28, 4年前 , 13F
另外,右值引用通常是不會加const的,跟初衷矛盾
04/10 19:28, 13F

04/10 19:30, 4年前 , 14F
第一個分隔線前的Deep Copy實際上也沒複製到member,
04/10 19:30, 14F

04/10 19:30, 4年前 , 15F
但你好像期待他會輸出解構a?
04/10 19:30, 15F

04/20 12:31, 4年前 , 16F
應該單純只是兩家的 複製省略 策略不同而已
04/20 12:31, 16F

04/20 15:21, 4年前 , 17F
優化條件不一樣阿 vs開用release跑就變右邊
04/20 15:21, 17F

04/20 15:23, 4年前 , 18F
沒有不一樣阿
04/20 15:23, 18F

04/20 15:27, 4年前 , 19F
function return會變成move所以不要在return call move
04/20 15:27, 19F

04/20 15:28, 4年前 , 20F
effective modern c++有寫 所以右邊是正確的
04/20 15:28, 20F

04/20 15:33, 4年前 , 21F
抱歉不是move 是copy elision
04/20 15:33, 21F

04/20 15:33, 4年前 , 22F
編譯器的實作是c會就地變成reference指向RVO
04/20 15:33, 22F

04/20 15:34, 4年前 , 23F
rvo生命週期就變成c的生命週期
04/20 15:34, 23F

04/20 15:43, 4年前 , 24F
推 g0010726: 樓樓上說的關掉優化在c++17後應該也沒用
04/20 15:43, 24F

04/20 15:43, 4年前 , 25F
跟優化無關
04/20 15:43, 25F
文章代碼(AID): #1WS1lQJG (C_and_CPP)
文章代碼(AID): #1WS1lQJG (C_and_CPP)