首頁 > 後端開發 > C++ > 對於大型對象,值傳遞應該成為 C 11 中的預設值嗎?

對於大型對象,值傳遞應該成為 C 11 中的預設值嗎?

Patricia Arquette
發布: 2024-12-02 17:35:11
原創
450 人瀏覽過

Should Pass-by-Value Be the Default in C  11 for Large Objects?

重新思考 C 11 中的值傳遞

在傳統 C 中,按值傳遞到函數會導致大型物件的表現損失。因此,C 程式設計師選擇了按引用傳遞,提高了速度,但引入了所有權和記憶體管理的複雜性,特別是對於堆分配的物件。

C 11 引入了右值引用和移動建構函數,從而實現了高效的傳遞-std::vector 和 std::string 等大物件的值。這就提出了值傳遞是否應該成為此類類型的預設值的問題。

值傳遞:新的預設值?

根據 Dave Abrahams 的說法,如果函數內需要複製,則按值傳遞可以是首選預設值。透過允許編譯器處理複製,程式設計師可以避免明確複製操作:

void foo(T t) {
    // ...
}
登入後複製

與按引用傳遞相比:

void foo(T const& t) {
    auto copy = t;
    // ...
}
登入後複製

按值傳遞為調用者提供了靈活性:

T lval;
foo(lval); // copy from lvalue
foo(T {}); // (potential) move from prvalue
foo(std::move(lval)); // (potential) move from xvalue
登入後複製

例外情況按值傳遞

雖然按值傳遞可能適合某些類型,但透過引用傳遞const 仍然是合理的選擇:

  • 物件不應複製: 傳遞引用可確保不會出現不必要的複製
  • 經常按值傳遞的大型物件:即使使用移動語義,複製操作仍然可能很昂貴。
  • 執行緒之間傳送的物件: 透過引用傳遞可以實現高效率的執行緒同步。

以上是對於大型對象,值傳遞應該成為 C 11 中的預設值嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板