按值傳遞參數:重新思考const std::string &
Herb Sutter 最近質疑傳遞std::vector 和的傳統做法std::string 物件透過const 引用。他建議,在許多情況下,現在更可取的是按值傳遞它們,如以下代碼所示:
std::string do_something(std::string inval) { std::string return_val; // ... do stuff ... return return_val; }
雖然返回值是函數返回點的右值,並且可以移動成本-實際上,Sutter 語句的基本原理在於這樣的情況:
考慮一個呼叫函數B 的函數A,函數B 又呼叫函數C。 A 將一個字串參數傳遞給B,將其轉發給 C。 A 對 C 沒有直接了解。
如果B 和C 透過const 引用取得字串,則程式碼將如下所示:
void B(const std::string &str) { C(str); } void C(const std::string &str) { // Process `str` without storing it. }
與此方法,傳遞和接收指針就足夠了,避免了昂貴的複製或移動。
但是,如果 C 需要儲存string:
void C(const std::string &str) { // Process `str`. m_str = str; }
這會觸發複製建構函式和潛在的記憶體分配(忽略短字串最佳化)。雖然 C 11 的移動語義旨在消除不必要的複製,但 C 採用 const 引用可以防止這種情況發生,儘管 A 傳遞了臨時字串。
相反,如果 str 通過所有函數按值傳遞,則依賴移動語義來傳輸所有權,C 可以採用或丟棄數據,而不會引起複製操作。這種方法會帶來輕微的效能開銷,但它消除了記憶體分配,這可能是有利的,具體取決於特定的用例。
以上是您應該透過值還是常數參考傳遞「std::string」和「std::vector」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!