- 这是什么?
- 它有什么作用?
- 什么时候使用?
好的链接表示赞赏。
最佳答案
1。 “这是什么?”
而std::move()
从技术上讲,它是一个函数 - 我会说 它不是 真的 一个函数。它是编译器考虑表达式值的方式之间的一种转换器。
2。 “它有什么作用?”
首先要注意的是 std::move()
实际上不会 move 任何东西。它将表达式从 lvalue (例如命名变量)成为 xvalue .一个 xvalue 告诉编译器:
You can plunder me, move anything I'm holding and use it elsewhere (since I'm going to be destroyed soon anyway)".
换句话说,当你使用 std::move(x)
, 你允许编译器蚕食 x
.因此,如果 x
比如说,在内存中有自己的缓冲区 - 在 std::move()
之后编译器可以让另一个对象拥有它。
您也可以从 prvalue move (例如您正在传递的临时),但这很少有用。
3。 “什么时候应该使用?”
问这个问题的另一种方式是“我会为了什么而蚕食现有对象的资源?”好吧,如果您正在编写应用程序代码,那么您可能不会对编译器创建的临时对象进行过多处理。所以主要你会在构造函数、操作方法、标准库算法等函数等地方执行此操作。在这些地方,对象会自动创建和销毁很多。当然,这只是经验法则。
典型的用途是将资源从一个对象“move ”到另一个对象,而不是复制。 @Guillaume 链接到 this page其中有一个简单的简短示例:用更少的复制交换两个对象。
template <class T>
swap(T& a, T& b) {
T tmp(a); // we now have two copies of a
a = b; // we now have two copies of b (+ discarded a copy of a)
b = tmp; // we now have two copies of tmp (+ discarded a copy of b)
}
使用 move 可以交换资源而不是复制它们:
template <class T>
swap(T& a, T& b) {
T tmp(std::move(a));
a = std::move(b);
b = std::move(tmp);
}
想想T
时会发生什么例如,vector<int>
大小为 n。在第一个版本中,您读取和写入 3*n 个元素,在第二个版本中,您基本上只读取和写入指向 vector 缓冲区的 3 个指针,以及 3 个缓冲区的大小。当然,上课T
需要知道如何搬家;你的类(class)应该有一个 move 赋值运算符和一个 move 构造函数用于类T
让它工作。
关于c++ - 什么是 std::move(),什么时候应该使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3413470/