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

值傳遞應該成為 C 11 中值類型的預設值嗎?

Susan Sarandon
Susan Sarandon原創
2024-12-05 18:13:11421瀏覽

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

C 11 中的值傳遞:重新評估

在C 11 中,右值引用和移動構造函數的引入引發了辯論:按值傳遞是否應該成為值的預設值類型?

引用傳遞的起源

從歷史上看,由於不必要的複製,在 C 中按值傳遞大型物件效率很低。首選參考參數以避免代價高昂的重複。然而,引用引入了所有權和記憶體管理的複雜性,特別是對於堆分配的物件。

C 11 中的新範式

使用右值引用和移動構造函數,它現在可以實現像std::vector 和std::string 這樣的值類型,它們透過值傳遞的成本很低。這就提出了一個問題:按值傳遞應該成為這些類型的新標準嗎?

建議

根據 Dave Abrahams 的說法,如果以下情況,建議按值傳遞:函數內需要複製。這允許編譯器最佳化副本,如下例所示:

void foo(T t)
{
    // ...
}

這可以靈活地用於傳遞左值、純右值或x值:

T lval;
foo(lval); // copy from lvalue
foo(T {}); // (potential) move from prvalue
foo(std::move(lval)); // (potential) move from xvalue

異常

對於某些場景,透過引用傳遞const 仍然是一個合理的選擇複製是不必要的或不受歡迎的。在這種情況下,可以採用以下語法:

class T {
    U u;
    V v;
public:
    T(U u, V v)
        : u(std::move(u))
        , v(std::move(v))
    {}
};

結論

在C 11 中,對於值類型來說,按值傳遞是一個引人注目的選項需要在函數內複製。它簡化了參數處理並允許高效的移動操作。然而,在不需要副本的情況下,透過引用傳遞 const 仍然是一個合適的替代方案。

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

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