首頁 >後端開發 >C++ >您應該透過值還是常數參考傳遞「std::string」和「std::vector」?

您應該透過值還是常數參考傳遞「std::string」和「std::vector」?

Susan Sarandon
Susan Sarandon原創
2024-12-29 00:22:10710瀏覽

Should You Pass `std::string` and `std::vector` by Value or Const Reference?

按值傳遞參數:重新思考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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn