看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) 平台可能是 mingw32 或 (32||64) 位元的 Ubuntu G++ >= 4.6.2, with -std=c++0x (-std=c++11) flags on 問題(Question): 想請問一下, 我的程式中有如下片段 vector<my_type> result; if (condition) result = function1(); else result = function2(); 而 function1, function2 的 prototype 皆為 vector<my_type> functionX(); 那麼我需要擔心那兩行賦值所花的時間嗎? 還是其實並不會有複製的動作? 另外請問有沒有推薦關於 C++ 這方面規定/G++現有的實做方面的資料呢? 之前想測試這類 return (by value, by ref) 以及宣告新變數時會呼叫 operator=, copy constructor, 或是普通的建構子, 可是結果跟我胡亂猜測的差很多.. 另外, 假如我在函式的參數中用 call by value, 那標準函式庫中的容器(特別是vector) 有可能自己優化掉改用 R-value reference (若我剛好傳給他的是 R-value)嗎? 麻煩各位大大解惑了, 謝謝! <(_ _)> -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.166.52.23 ※ 編輯: suhorng 來自: 118.166.52.23 (02/15 16:53)
coolcomm:為什麼不傳參考= = 02/15 17:12
指說改成 void functionX(vector<mpz_class>&) 嗎? 因為這樣看不出來會更改, 不太想寫成這樣的形式 ※ 編輯: suhorng 來自: 118.166.52.23 (02/15 18:13)
bachelorwhc:許多編譯器針對return有做過RVO,詳細的要看編譯實作 02/15 18:53
LPH66:這個狀況即使 RVO 啟動似乎還是會需要一次 copy 02/15 18:59
瞭解... 謝謝兩位
bachelorwhc:我和coolcomn持相同的意見;但我不太懂原PO的意思 02/15 19:03
感覺上使用這樣的函式時, code中比較看不出變數究竟會不會被修改, 除非去查看函數的文件(??)或是 prototype? ※ 編輯: suhorng 來自: 118.166.52.23 (02/15 19:22)
linotwo:比較新的編譯器會用 move constructor / assignment 02/15 19:12
我去查查這兩個東西XD 謝謝!
bachelorwhc:用const修飾就一目了然,再說其實從函數的命名也能猜 02/15 20:48
bachelorwhc:想;另一個方式,可以用pointer避免複製的成本 02/15 20:49
嗯 謝謝 bachelorwhc 大的意見 無論有沒有用 const 修飾, 在呼叫該函式的那段 code 中總看不出來. 命名聽起來很合理XD ※ 編輯: suhorng 來自: 118.166.52.23 (02/15 22:04)
AntaresStar:既然c++11 flag on 那應該就會move而不會複製 02/15 22:20
adxis:有些 coding standard 會要求使用 X(T* param) 明確表達 X 02/16 14:07
adxis:會修改 param ,而不是用 reference 的方式 02/16 14:08
adxis:支援 move 的狀況下就放心寫 return value 吧~ 02/16 14:08
謝謝各位提供解法!! ※ 編輯: suhorng 來自: 118.166.52.23 (02/16 17:02)
amozartea:傳參考或指標阿 02/18 14:33