[問題] vector複製時間消耗

看板C_and_CPP作者 ( )時間12年前 (2013/02/15 08:52), 編輯推噓2(2010)
留言12則, 7人參與, 最新討論串1/3 (看更多)
開發平台(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)

02/15 17:12, , 1F
為什麼不傳參考= =
02/15 17:12, 1F
指說改成 void functionX(vector<mpz_class>&) 嗎? 因為這樣看不出來會更改, 不太想寫成這樣的形式 ※ 編輯: suhorng 來自: 118.166.52.23 (02/15 18:13)

02/15 18:53, , 2F
許多編譯器針對return有做過RVO,詳細的要看編譯實作
02/15 18:53, 2F

02/15 18:59, , 3F
這個狀況即使 RVO 啟動似乎還是會需要一次 copy
02/15 18:59, 3F
瞭解... 謝謝兩位

02/15 19:03, , 4F
我和coolcomn持相同的意見;但我不太懂原PO的意思
02/15 19:03, 4F
感覺上使用這樣的函式時, code中比較看不出變數究竟會不會被修改, 除非去查看函數的文件(??)或是 prototype? ※ 編輯: suhorng 來自: 118.166.52.23 (02/15 19:22)

02/15 19:12, , 5F
比較新的編譯器會用 move constructor / assignment
02/15 19:12, 5F
我去查查這兩個東西XD 謝謝!

02/15 20:48, , 6F
用const修飾就一目了然,再說其實從函數的命名也能猜
02/15 20:48, 6F

02/15 20:49, , 7F
想;另一個方式,可以用pointer避免複製的成本
02/15 20:49, 7F
嗯 謝謝 bachelorwhc 大的意見 無論有沒有用 const 修飾, 在呼叫該函式的那段 code 中總看不出來. 命名聽起來很合理XD ※ 編輯: suhorng 來自: 118.166.52.23 (02/15 22:04)

02/15 22:20, , 8F
既然c++11 flag on 那應該就會move而不會複製
02/15 22:20, 8F

02/16 14:07, , 9F
有些 coding standard 會要求使用 X(T* param) 明確表達 X
02/16 14:07, 9F

02/16 14:08, , 10F
會修改 param ,而不是用 reference 的方式
02/16 14:08, 10F

02/16 14:08, , 11F
支援 move 的狀況下就放心寫 return value 吧~
02/16 14:08, 11F
謝謝各位提供解法!! ※ 編輯: suhorng 來自: 118.166.52.23 (02/16 17:02)

02/18 14:33, , 12F
傳參考或指標阿
02/18 14:33, 12F
文章代碼(AID): #1H7VTEYe (C_and_CPP)
文章代碼(AID): #1H7VTEYe (C_and_CPP)