看板 C_and_CPP 關於我們 聯絡資訊
: 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
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