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