gpt4 book ai didi

c++ - 为什么不总是在 C++ 中通过 const 引用传递?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:11:01 25 4
gpt4 key购买 nike

我知道当您想更改原始变量的值时,您会通过引用传递给 C++ 中的函数。但是当您希望程序更高效并且不想更改传递给函数的变量中的任何内容时,您也可以通过引用传递,只需将其设为常量即可。我的问题是,为什么不总是让你的函数接受通过 const 引用传递的变量,如果它比仅仅传递变量并让编译器在函数范围内创建一个新变量更有效的话?要扩展这个问题,函数需要复制通过参数传递的变量的情况是什么?

最佳答案

当参数按值传递时,它是可修改的并且可以省略复制它。例如,实现赋值运算符的规范方式如下所示:

T& T::operator= (T value) {
value.swap(*this);
return *this;
}

乍一看它可能看起来效率低下,因为正在复制 T。然而,它无论如何都会被复制,也就是说,如果需要一份拷贝,将以任何一种方式创建:

T& T::operator= (T const& value) {
T(value).swap(*this); // has to do a copy right here
return *this;
}

但是,对于第一个版本,可能根本不创建拷贝,例如

T f() { return T(); }
// ...
T x = ...;
x = f();

当将类型为 Tf() 的结果分配给 x 时,编译器可能会决定它不需要复制 f() 的结果并将其直接传递给赋值运算符。在这种情况下,如果赋值运算符通过 const& 获取参数,则编译器必须在赋值运算符内创建一个拷贝。在按值获取参数的实现中,它可以省略拷贝!事实上,f() 的返回已经可以省略复制,即对f() 的调用和随后的赋值可能只涉及对象的默认构造! ...对于许多现代编译器来说,确实如此!

换句话说:如果您需要复制一个参数,通过值传递它可以避免创建拷贝的需要。此外,您可以 std::move() 来自值参数,但不能来自 const& 参数。

关于c++ - 为什么不总是在 C++ 中通过 const 引用传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19967958/

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