首頁 >後端開發 >C++ >我們還應該透過 const & 傳遞 std::string 嗎?

我們還應該透過 const & 傳遞 std::string 嗎?

DDD
DDD原創
2024-12-12 14:27:14932瀏覽

Should We Still Pass std::string by const &?

Const Std::string 和參數的過去時代

在最近的一次討論中,Herb Sutter 提出了這樣的觀點:透過const & 參數傳遞std::vector 和std::string 可能不再有相同的權重。他提出的替代方案,即按值傳遞這些對象,引發了爭論並提出了問題。

理解過渡

薩特為什麼提倡這種轉變?主要原因在於類似下面描述的場景:

考慮一個函數 A 呼叫函數 B,函數 B 又呼叫函數 C。函數 A 將字串經由 B 傳遞到 C 中,並保持它不知道C 的存在。

Const & Approach:

當B 和C 接收字串為const & 參數,交互發生如下:

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

void C(const std::string &str) {
  // Manipulates `str` but does not store it.
}

這種方法參數,交互發生如下:

這種方法有效地循環指針,避免不必要的複製或移動。 C 接受 const & 因為它只打算使用字串,而不是儲存它。

值方法:

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

但是,如果C 的功能要求它儲存字串,進行以下修改:

如您所見,C 不再簡單地使用字串,還儲存它。 C 11 的移動語意理論上應該消除不必要的複製,但 C 的 const & 參數阻止了這一點。相反,複製構造函數和潛在的記憶體分配開始發揮作用。

繞過 Const &:

繞過 const & 參數並透過所有函數按值傳遞字串可以消除這種情況問題。 std::move 可以在需要時有效地打亂資料。如果函數打算保留字串,它可以這樣做。

效能注意事項:

與使用引用相比,按值傳遞確實會產生更高的效能開銷。然而,對於受益於 SSO 的小字串,成本可以忽略不計。

結論

是否透過 const & 或 value 傳遞 std::string 的決定取決於具體用例及其對記憶體分配的敏感性。雖然按值傳遞可能不是普遍優選的,但它在某些情況下提供了引人注目的優勢。

以上是我們還應該透過 const & 傳遞 std::string 嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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