C_and_CPP 板


LINE

------ #先說明,回傳時通常傳參考就沒這些問題,故意這樣寫只是想搞懂 現在覺得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://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1617959898.A.4D0.html ※ 編輯: DeepFapping (118.163.83.72 臺灣), 04/09/2021 17:19:36
1F:→ nh60211as: 是不是還有Copy elision要考慮,我現在沒辦法測試 04/09 17:30
2F:→ DeepFapping: 臥槽,剛查了一下,我沒學過這東西,所以這是編譯器 04/09 17:47
3F:→ DeepFapping: 優化的問題,設中斷點也看不到的結果,不知遇到這種 04/09 17:47
4F:→ DeepFapping: 問題要如何學習?感謝。以試過,g++結果跟Visual C 04/09 17:47
5F:→ DeepFapping: ++一樣了,但是仍然跟我想的不一樣= =" 04/09 17:47
6F:→ Lipraxde: 先從怎麼把所有相關的優化關掉開始學 04/09 18:08
7F:推 s4300026: 左邊的啊 04/09 18:29
8F:推 g0010726: 樓樓上說的關掉優化在c++17後應該也沒用了 有些rvo變成 04/10 06:30
9F:→ g0010726: 強制的 規則可以在cppreference翻一下 04/10 06:30
10F:→ g0010726: 抱歉 應該說 copy elision 比較準確 04/10 06:31
11F:→ Lipraxde: 是嗎?我有點忘記以前試的時候是不是用 c++17 了。 04/10 13:53
12F:→ a27417332: Copy Elision或RVO發生的時候根本連Move都不會有 04/10 19:24
13F:→ a27417332: 另外,右值引用通常是不會加const的,跟初衷矛盾 04/10 19:28
14F:→ a27417332: 第一個分隔線前的Deep Copy實際上也沒複製到member, 04/10 19:30
15F:→ a27417332: 但你好像期待他會輸出解構a? 04/10 19:30
16F:→ hunandy14: 應該單純只是兩家的 複製省略 策略不同而已 04/20 12:31
17F:推 MartinJ40: 優化條件不一樣阿 vs開用release跑就變右邊 04/20 15:21
18F:→ MartinJ40: 沒有不一樣阿 04/20 15:23
19F:→ MartinJ40: function return會變成move所以不要在return call move 04/20 15:27
20F:→ MartinJ40: effective modern c++有寫 所以右邊是正確的 04/20 15:28
21F:→ MartinJ40: 抱歉不是move 是copy elision 04/20 15:33
22F:→ MartinJ40: 編譯器的實作是c會就地變成reference指向RVO 04/20 15:33
23F:→ MartinJ40: rvo生命週期就變成c的生命週期 04/20 15:34
24F:→ MartinJ40: 推 g0010726: 樓樓上說的關掉優化在c++17後應該也沒用 04/20 15:43
25F:→ MartinJ40: 跟優化無關 04/20 15:43







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:e-shopping站內搜尋

TOP