將 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中文網其他相關文章!