首頁 >後端開發 >C++ >在現代 C 中透過 `const std::string&` 傳遞 `std::string` 仍然有好處嗎?

在現代 C 中透過 `const std::string&` 傳遞 `std::string` 仍然有好處嗎?

Susan Sarandon
Susan Sarandon原創
2024-12-22 05:38:14656瀏覽

Is Passing `std::string` by `const std::string&` Still Beneficial in Modern C  ?

將 Const std::string & 作為參數傳遞還有好處嗎?

在最近的一次演講中,著名 C 專家 Herb Sutter 建議透過 const & 傳遞 std::vector 和 std::string 的參數不再引人注目。為了說明這一點,他提出了一個寫如下的函數:

std::string do_something ( std::string inval )
{
   std::string return_val;
   // ... do stuff ...
   return return_val;
}

Herb 推斷,由於return_val 在函數返回時將是一個右值,因此可以使用具有成本效益的移動語義來返回它。然而,問題仍然存在:為什麼要透過引用傳遞輸入參數 inval ? std::string 物件的較大尺寸(由於堆疊指標和字元陣列等元件)是否會使值傳遞更有利?

Herb 的基本原理

Herb 的建議源自於涉及多個巢狀函數的場景。考慮這樣一種情況:函數 A 呼叫函數 B,函數 B 又呼叫函數 C,每個函數都傳遞一個字串參數。如果 B 和 C 將字串作為 const &,則程式碼可能如下所示:

void B(const std::string & str) {
  C(str);
}

void C(const std::string & str) {
  // Use `str` without storing it.
}

這種方法有效地傳遞指針,避免複製或移動。 C 採用 const & 因為它不儲存字串。

但是,假設 C 現在需要儲存字串。將C 修改為以下內容將強制B 執行對其參數的複製,從而消除任何好處:

void C(const std::string & str) {
  // ...
  m_str = str;
}

相反,如果str 在所有函數中按值傳遞,則依賴std::move處理數據移動,C 可以簡單地接受臨時字串的所有權,從而消除對副本的需要。

成本注意事項

雖然與使用引用相比,按值傳遞會帶來輕微的性能損失,但它與使用SSO 複製小字符串的成本相當。這些方法之間的選擇取決於記憶體分配的頻率和特定的用例。

以上是在現代 C 中透過 `const std::string&` 傳遞 `std::string` 仍然有好處嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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