首页 > 后端开发 > C++ > 值传递应该成为 C 11 中值类型的默认值吗?

值传递应该成为 C 11 中值类型的默认值吗?

Susan Sarandon
发布: 2024-12-05 18:13:11
原创
408 人浏览过

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板