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