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