C++11引入了右值引用的新概念。我在某处读到它并发现以下内容:
class Base
{
public:
Base() //Default Ctor
Base(int t) //Parameterized Ctor
Base(const Base& b) //Copy Ctor
Base(Base&& b) //Move Ctor
};
void foo(Base b) //Function 1
{}
void foo(Base& b) //Function 2
{}
int main()
{
Base b(10);
foo(b); -- Line 1 (i know of ambiquity but lets ignore for understanding purpose)
foo(Base()); -- Line 2
foo(2) ; -- Line 3
}
现以我有限的理解,我的观察如下:
第 1 行将简单地调用复制构造函数,因为参数是左值。
C++11 之前的第 2 行将调用复制构造函数和所有那些临时复制内容,但定义了移动构造函数后,将在此处调用它们。
第 3 行将再次调用移动构造函数,因为第 2 行将隐式转换为基本类型(右值)。
以上观察如有错误,请指正并解释。
现在,这是我的问题:
我知道一旦我们移动一个对象,它的数据就会在调用位置丢失。那么,在上面的示例中,我如何更改第 2 行以移动 foo 中的对象“b”(是否使用 std::move(b) ?)。
我读过移动构造函数比复制构造函数更有效。如何?我能想到的唯一情况是,在移动构造函数的情况下,堆上有内存不需要再次分配。当我们堆上没有任何内存时,这个说法是否成立?
它比通过引用传递更有效吗(不,对吧?)?
首先谈谈你的“理解”:
据我所知,他们原则上是正确的,但你应该意识到复制省略 https://stackoverflow.com/questions/12953127/what-are-copy-elision-and-return-value-optimization这可能会阻止程序调用任何复制/移动构造函数。取决于您的编译器(-设置)。
关于您的问题:
是的,您必须调用 foo(std::move(b)) 来调用带有左值的右值的函数。 std::move 将进行转换。注意: std::move 本身并不移动任何东西 https://stackoverflow.com/questions/21358432/why-is-stdmove-named-stdmove.
使用移动构造函数“可能”更有效。事实上,它只能让程序员实现一些更高效的构造函数。示例考虑一个向量,它是一个围绕指向保存数据的数组的指针的类(类似于 std::vector),如果复制它,则必须复制数据,如果移动它,则只需传递指针并设置旧的为 nullptr。
但当我读到有效的现代 C++ https://www.amazon.de/Effective-Modern-Specific-Ways-Improve/dp/1491903996作者:Scott Meyers:不要认为你的程序会更快,只是因为你使用了 std::move everywere。
That depends on the usage of the input. If you do not need a copy in the function it will in the most cases be more efficient to just pass the object by (const) reference. If you need a copy there are several ways of doing it for example the copy and swap idiom https://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom. But as a
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)