[問題] 請問copy constructor的問題

看板C_and_CPP (C/C++)作者 (mat)時間15年前 (2011/05/10 00:12), 編輯推噓4(4015)
留言19則, 5人參與, 最新討論串1/2 (看更多)
小弟我正在研究以下三個函數 被呼叫的時機 class Foo { public: Foo(); Foo( const Foo & rh ); Foo& operator=( cosnt Foo & rh ); }; 現在我定義這樣一個函數 Foo do_something ( ) { Foo f1; return f1; } 然後呼叫他 Foo f3 = do_something( ); 我發現f3並沒有呼叫上面三個函數裡面的任何一個, 我原本以為應該會觸發copy constructor,結果沒有 !!!? 問題是也沒有觸發assignment operator 唯一確定有跑的就是 f1 的 default constructor 請問這樣是正常的嗎? 我用的編譯器是codeblock內建的gcc 4.4.1 -- 懷著一顆對這個家有無限關愛的心,我,再度流浪到遠方。 --<舒伯特> 這些年來,我唱著歌,唱出愛,可是它對我來說卻是痛苦; 我唱出痛苦,可是它對我來說又是愛。 愛與痛苦就這樣分割著我。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.115.158.103

05/10 00:37, , 1F
RVO 的關係吧,加上 -fno-elide-constructors 試試
05/10 00:37, 1F

05/10 04:03, , 2F
應該是 RVO 沒錯
05/10 04:03, 2F

05/10 10:49, , 3F
~"~根據樓上給的建議,加入這指令是ok,但是版主的程式
05/10 10:49, 3F

05/10 10:50, , 4F
沒有觸發assignment,但是他不是有assignment的動作嗎?
05/10 10:50, 4F

05/10 11:22, , 5F
Return value optimization會判斷出來
05/10 11:22, 5F

05/10 11:22, , 6F
傳回的物件被用於初始化另外一個物件
05/10 11:22, 6F

05/10 11:23, , 7F
這個時候他會直接把這個物件拿來用,不會執行copy建構
05/10 11:23, 7F

05/10 11:24, , 8F
這樣可以減少一次個暫時物件的建立與銷毀,提高效能
05/10 11:24, 8F

05/10 11:34, , 9F
我改的程式碼會引起assignment,不知道angleevil怎麼寫的
05/10 11:34, 9F

05/10 12:06, , 10F
是否做RVO和編譯器實作有關,比較新的應該都有
05/10 12:06, 10F

05/10 14:47, , 11F
其實幾乎是照著版主的做,只是加幾個輸出幫助我觀察
05/10 14:47, 11F

05/10 14:48, , 12F
還有cosnt是錯字.我只有看到dafult和copy的輸出而已
05/10 14:48, 12F

05/10 14:54, , 13F
我搞錯了,這樣的程式不會引起assignment XDD
05/10 14:54, 13F

05/10 14:54, , 14F
http://pastie.org/1884031 這是我的程式
05/10 14:54, 14F

05/10 14:55, , 15F
assignment並不是看到「=」就會跑
05/10 14:55, 15F

05/10 14:55, , 16F
而要當「=」左邊是個「已經建立好的物件」才會跑assign
05/10 14:55, 16F

05/10 15:09, , 17F
我想請問一下第40行,為何copy constructor會觸發第二次
05/10 15:09, 17F

05/10 15:13, , 18F
第一次是把f1複製到臨時物件,第二次把臨時物件複製到f3
05/10 15:13, 18F

05/10 15:13, , 19F
(應該是吧...XD)
05/10 15:13, 19F
文章代碼(AID): #1Do19PNG (C_and_CPP)
文章代碼(AID): #1Do19PNG (C_and_CPP)