→ iamstudent:這邊補充一下,有支援RVO的編譯器才會這樣做 03/16 16:07
→ iamstudent:如果不支援的情況,可能會呼叫operator= 03/16 16:09
以上兩行錯誤,請無視 XD
我本來以為RVO是把operator=換成copy constructor
但是瞭解之後就知道不是了
→ iamstudent:比較新的編譯器應該都支援了才對 03/16 16:09
推 chise:請問i大 這是不是就類似Obj object=obj 的感覺? 03/16 16:16
→ chise:那再請問 若是 cout << CreateObj() 這樣也是copy construc- 03/16 16:18
→ chise:tor 會被呼叫嗎? 03/16 16:19
→ chise:我想說的是 若是CreateObj()前面沒有Obj object存在的話 03/16 16:22
→ iamstudent:看寫法吧,operator<<(Obj)會, operator<<(Obj&)不會 03/16 16:27
推 littleshan:不對,這邊有支援RVO的compiler不會呼叫copy-ctor 03/16 16:29
→ littleshan:不支援RVO的會呼叫copy-ctor,而operator=都不會出現 03/16 16:30
推 chise:感謝i大的解說 雖然我不懂i大l大說的RVO是啥 我是自學的 冏 03/16 16:33
以下是我目前查到的return value optimization與理解
→ iamstudent:RVO的目標是消除多餘的物件複製,包含cp cstr和op= 03/16 16:43
→ iamstudent:原理是因為return物件會放在stack中,而local變數也是 03/16 16:44
→ iamstudent:RVO能夠直接拿來用,不需要再多一次複製動作 03/16 16:45
※ 編輯: iamstudent 來自: 140.113.210.62 (03/16 16:57)
※ 編輯: iamstudent 來自: 140.113.210.62 (03/16 17:00)
推 Chikei:正確來說這是實作原理,但是更重要的是標準在這邊有允許 03/16 16:59
→ Chikei:就算copy ctor "有" 副作用,compiler一樣可以省略 03/16 17:00
推 QQ29:這時就要使用詭異的move constructor了 03/16 23:25