Re: [問題] copy constructor的return by value

看板C_and_CPP作者 (stu)時間13年前 (2012/03/16 16:06), 編輯推噓5(5012)
留言17則, 5人參與, 最新討論串2/2 (看更多)
: 3. When an object is returned from a function by value. : 不過這個我就不能理解copy constructor怎麼被呼叫出來用了 : 請問各位 3 這種情況是??? class Obj{...}; Obj CreatObj() { Obj obj; .... return obj } int main() { Obj object = CreateObj(); //發生在這個地方,object的產生是copy contructor ... return 0; } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.210.62

03/16 16:07, , 1F
這邊補充一下,有支援RVO的編譯器才會這樣做
03/16 16:07, 1F

03/16 16:09, , 2F
如果不支援的情況,可能會呼叫operator=
03/16 16:09, 2F
以上兩行錯誤,請無視 XD 我本來以為RVO是把operator=換成copy constructor 但是瞭解之後就知道不是了

03/16 16:09, , 3F
比較新的編譯器應該都支援了才對
03/16 16:09, 3F

03/16 16:16, , 4F
請問i大 這是不是就類似Obj object=obj 的感覺?
03/16 16:16, 4F

03/16 16:18, , 5F
那再請問 若是 cout << CreateObj() 這樣也是copy construc-
03/16 16:18, 5F

03/16 16:19, , 6F
tor 會被呼叫嗎?
03/16 16:19, 6F

03/16 16:22, , 7F
我想說的是 若是CreateObj()前面沒有Obj object存在的話
03/16 16:22, 7F

03/16 16:27, , 8F
看寫法吧,operator<<(Obj)會, operator<<(Obj&)不會
03/16 16:27, 8F

03/16 16:29, , 9F
不對,這邊有支援RVO的compiler不會呼叫copy-ctor
03/16 16:29, 9F

03/16 16:30, , 10F
不支援RVO的會呼叫copy-ctor,而operator=都不會出現
03/16 16:30, 10F

03/16 16:33, , 11F
感謝i大的解說 雖然我不懂i大l大說的RVO是啥 我是自學的 冏
03/16 16:33, 11F
以下是我目前查到的return value optimization與理解

03/16 16:43, , 12F
RVO的目標是消除多餘的物件複製,包含cp cstr和op=
03/16 16:43, 12F

03/16 16:44, , 13F
原理是因為return物件會放在stack中,而local變數也是
03/16 16:44, 13F

03/16 16:45, , 14F
RVO能夠直接拿來用,不需要再多一次複製動作
03/16 16:45, 14F
※ 編輯: iamstudent 來自: 140.113.210.62 (03/16 16:57) ※ 編輯: iamstudent 來自: 140.113.210.62 (03/16 17:00)

03/16 16:59, , 15F
正確來說這是實作原理,但是更重要的是標準在這邊有允許
03/16 16:59, 15F

03/16 17:00, , 16F
就算copy ctor "有" 副作用,compiler一樣可以省略
03/16 17:00, 16F

03/16 23:25, , 17F
這時就要使用詭異的move constructor了
03/16 23:25, 17F
文章代碼(AID): #1FOlIC0Z (C_and_CPP)
文章代碼(AID): #1FOlIC0Z (C_and_CPP)