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