gpt4 book ai didi

c++ - 在 C++11 中,按值传递是一个合理的默认值吗?

转载 作者:IT老高 更新时间:2023-10-28 11:32:30 25 4
gpt4 key购买 nike

在传统的 C++ 中,将值传递给函数和方法对于大型对象来说速度很慢,并且通常不受欢迎。取而代之的是,C++ 程序员倾向于传递引用,这更快,但它引入了有关所有权,尤其是内存管理的各种复杂问题(如果对象是堆分配的)

现在,在 C++11 中,我们有 Rvalue 引用和移动构造函数,这意味着可以实现一个通过值传递很便宜的大对象(如 std::vector)进出函数。

那么,这是否意味着对于诸如 std::vectorstd::string 等类型的实例,默认值应该是按值传递?自定义对象呢?新的最佳做法是什么?

最佳答案

这是一个合理的默认值如果您需要在正文中进行复制。这就是 Dave Abrahams is advocating :

Guideline: Don’t copy your function arguments. Instead, pass them by value and let the compiler do the copying.

在代码中这意味着不要这样做:

void foo(T const& t)
{
auto copy = t;
// ...
}

但是这样做:

void foo(T t)
{
// ...
}

它的优点是调用者可以像这样使用 foo:

T lval;
foo(lval); // copy from lvalue
foo(T {}); // (potential) move from prvalue
foo(std::move(lval)); // (potential) move from xvalue

并且只完成了最少的工作。您需要两个重载才能对引用执行相同操作,void foo(T const&);void foo(T&&);

考虑到这一点,我现在编写了我的有值(value)的构造函数:

class T {
U u;
V v;
public:
T(U u, V v)
: u(std::move(u))
, v(std::move(v))
{}
};

否则,通过引用传递 const 仍然是合理的。

关于c++ - 在 C++11 中,按值传递是一个合理的默认值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7592630/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com