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

对于大型对象,值传递应该成为 C 11 中的默认值吗?

Patricia Arquette
Patricia Arquette原创
2024-12-02 17:35:11369浏览

Should Pass-by-Value Be the Default in C  11 for Large Objects?

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn