C_and_CPP 板


LINE

[修正] RVO 不會消除 copy-assignment [/修正]
1F:推 holymars:RVO是因為Compiler會把return value當成參數傳進function 10/20 13:02
2F:→ holymars:裡才會有的optimization吧..如果函式本身inline 10/20 13:03
3F:→ holymars:就不用把return value放在參數列上,自然也不會進行 10/20 13:03
4F:→ holymars:RVO啊.. 10/20 13:03
RVO 牽涉的不只是 implementation detail 它也會影響到語意 因為它是直接「消除」掉 copy-constructor 即使這個 copy-constructor 具有 side effect 也是一樣會被省略 但 inline function 是不能影響語意的 compiler 不能因為 inline function 就自動省略該有的 constructor 除非說 copy-constructor 是 compiler 自己產生所以它知道內容 上面的例子比較不明顯 我舉 NRVO 來當例子 class Foo { public: Foo(const Foo& f) { puts("Foo::Foo()"); } Foo() {} Foo& operator=(const Foo& f) { puts("Foo::operator=()"); return *this; } }; inline Foo bar(const Foo& f) { Foo tmp = f; // copy constructor return tmp; } int main() { Foo a; Foo b = bar(a); return 0; } 如果依照你的說法 因為 inline function 的緣故 在宣告 b 的地方應該會展開成 Foo tmp = a; Foo b = tmp; 因此會產生兩次 copy-constructor 呼叫 但實際上只會有一次 因為 NRVO 允許 compiler 直接把 tmp 代換成 b 而節省一次 copy-constructor 「即使」在這個情況中因為 inline function 的緣故 使得 b 的位址沒辦法當作參數傳進 function 當中 但 compiler 知道上述的程式碼是「inline function 展開後」的結果 還是有辦法讓 NRVO 起作用的 另一方面 在一般情況下 compiler 不可能會把兩次的 copy-constructor 縮減成一次 因為它不知道你在 copy-constructor 中寫了什麼東西 所以無法保證 Foo tmp = a; Foo b = tmp; 與 Foo b = a; 的結果是相同的 所以在這個 case 中 用 NRVO 來解釋 compiler 消除掉 copy-constructor 的行為 才是最合理的 --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.29.108
5F:→ Chikei:呃,inline的確不會有RVO,因為RVO消除的是obj A=func()中 10/21 01:46
6F:→ Chikei:obj A=(tmpObj B=func())的tmpObj B這個暫存物件,所以在 10/21 01:48
7F:→ Chikei:inline下不需要暫存returned value,自然也不用RVO,你所講 10/21 01:49
8F:→ Chikei:修正,*消除的是拷貝returned value到tmpObj B這個動作 10/21 01:53
9F:→ Chikei:另外,copy assignment也不會被消除,根據ISO C++ 12.8.15 10/21 01:54
10F:→ Chikei:能省略的只有從tmpObj copy出來時的copy ctor跟func return 10/21 01:58
11F:→ Chikei:時,為了承接return值而用來產生tmpObj的copy ctor 10/21 01:59
12F:推 Chikei:上面那串討論之所以=不會被invoke是因為obj A = B是直接呼 10/21 02:17
13F:→ Chikei:修正,*obj A = B等於obj A(B) (copy initialize)所以不會 10/21 02:18
14F:→ Chikei:動到operator= 10/21 02:19
15F:推 holymars:obj A = B; 和obj A(B)是不一樣的 10/21 10:34
16F:→ holymars:前者是copy initialize,後者是direct initialize 10/21 10:35
17F:推 holymars:RVO也不是指省略掉tmpObj那件事 10/21 10:37
18F:→ holymars:12.8.15所允許的省略好像沒什麼正式名稱 就copy elison 10/21 10:38
19F:推 holymars:^^^^^^^修正一下 是12.8.15的第三個條件 10/21 10:53
※ 編輯: littleshan 來自: 140.112.29.108 (10/21 11:51)







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燈, 水草

請輸入看板名稱,例如:Soft_Job站內搜尋

TOP