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