推 LPH66:當然可以, 只不過由於複製成本通常較 primitive 形態大 06/20 01:44
→ LPH66:所以一般不會用 call by value 傳進去 06/20 01:45
→ LPH66:另外你後面提的方法其實很接近一種叫做 RVO 的最佳化策略 06/20 01:45
→ LPH66:在有啟動 RVO 的時候, 編譯器會幫你把前一段程式變成後一段 06/20 01:46
→ LPH66:你寫的程式跟 RVO 的差別在於, RVO 會直接在 fun1 裡初始化 06/20 01:47
→ LPH66:那個外面的物件, 而你這段程式是初始化完了才傳參考進去 06/20 01:48
→ LPH66:(註: RVO 是標準允許的最佳化, 即使可能因此不呼叫 ctor 等) 06/20 01:51
推 kkkmode:物件用等號賦值或從函式以"值"返回時,都會呼叫 06/20 02:06
→ kkkmode:copy constructor,你是指這個嗎? 06/20 02:07
推 Killercat:call by value要考慮shallow copy的問題, 06/20 09:28
→ Killercat:你的結構裡面要是有指標的話 很可能會拿到一個出了結構 06/20 09:29
→ Killercat:說錯 出了scope 就無效的指標 06/20 09:29
→ Killercat:其實我個人認為copy by value在某些層面上是個危險動作 06/20 09:30
→ Killercat:除非你能非常有把握的處理掉shallow copy造成的無效指標 06/20 09:30
→ Killercat:而把結構hold住的指標全部改成shared_ptr可以降低風險 06/20 09:31
→ Killercat:但是deep copy會演變成一個recursive copy的問題就是 06/20 09:32
→ Killercat:總之 我認為你可能沒想到那麼多,除非有必要否則多半還 06/20 09:33
→ Killercat:是儘量避免對結構by value的方式會比較好 06/20 09:34
→ loveme00835:傳物件時,需要考慮一下是否其實是move語意 06/20 09:37
→ loveme00835:或者你應該仔細分析 fun1() 做的是不是 ctor 在做的工 06/20 10:38
→ loveme00835:作,如果是,那應該把程式碼放在 ctor 裡。 06/20 10:38
→ loveme00835:如果不是,也許應該變成 member function 做一些操作 06/20 10:39
→ loveme00835:的前置動作(非初始化) 06/20 10:39
謝謝各位!
我想的到不要用call by value的原因是效率問題,
但沒考量到如果物件裡面有指標,call by value確實可能有危險。
感謝各位高手的提點^^
※ 編輯: Keitaro (114.43.193.222), 06/24/2014 22:48:04