c++ - 什么是 std::move(),什么时候应该使用它?

标签 c++ c++11 move-semantics c++-faq stdmove

  1. 这是什么?
  2. 它有什么作用?
  3. 什么时候使用?

好的链接表示赞赏。

最佳答案

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/

相关文章:

c++ - 访问 map 中的两个 vector 是不可能的吗?

c++ - 为什么 std::vector 使用 move 构造函数,尽管声明为 noexcept(false)

C++11 成员初始化列表歧义

c++ - 有没有办法将 std::move std::string 放入 std::stringstream

c++ - 在 map 中插入对象而不复制对象

c++ - 打印出 float 的内六角

c++ - 如何将文件中的特定表达式切换为小写(linux 命令)

c++ - ifstream:从文件中读取十进制格式和十六进制格式的整数值

c++ - 将 const 类对象传递给 std::function 和 std::bind 会导致编译错误

c++ - std::count 和 std::find 之间的性能差异