什么时候用std::move()?

Posted PaQiuQiu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么时候用std::move()?相关的知识,希望对你有一定的参考价值。

文章目录

1. “是什么?”

虽然 std::move() 从技术角度上是一个函数 ,但我认为它不是真正的函数。 它是编译器考虑表达式值的方式之间的转换器

2. “有何用?”

首先要注意的是 std::move() 实际上没有移动任何东西。 它将表达式从左值(例如以及命名的变量)更改为 xvaluexvalue 告诉编译器:

你可以掠夺我,移动我持有的任何东西并在别处使用它(因为我很快就会被摧毁)”。

换句话说,当您使用 std::move(x) 时,您允许编译器蚕食 x。 因此,如果 x 在内存中有自己的缓冲区,在 std::move() 之后,编译器可以让另一个对象拥有它。

您也可以从prvalue移动(例如您正在传递的临时值),但这很少有用。

3. “什么时候用?”

另一种问这个问题的方式是“我要蚕食现有对象的资源有什么用?” 好吧,如果您正在编写应用程序代码,您可能不会对编译器创建的临时对象进行大量处理。 因此,主要是在构造函数、运算符方法、类似标准库算法的函数等地方执行此操作,在这些地方对象会自动创建和销毁很多。 当然,这只是一个经验法则。

A typical use is ‘moving’ resources from one object to another instead of copying. @Guillaume links to this page which has a straightforward short example: swapping two objects with less copying.

典型的用途是将资源从一个对象“移动”到另一个对象而不是复制。 下面是一个简单明了的简短示例:用更少的复制交换两个对象。

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”是大小为 n 的“vector”时会发生什么。 在第一个版本中,您读写 3*n 个元素,在第二个版本中,您基本上只读写指向向量缓冲区的 3 个指针,加上 3 个缓冲区的大小。 当然,类 T 需要知道如何移动; 你的类应该有一个移动赋值运算符和一个移动构造函数,类 T 才能工作。

参考链接:http://thbecker.net/articles/rvalue_references/section_01.html

以上是关于什么时候用std::move()?的主要内容,如果未能解决你的问题,请参考以下文章

std::move与std::forward

std::move与std::forward

std::move与std::forward

C/C++学习记录:std::move 源码分析

C/C++学习记录:std::move 源码分析

C++11的右值引用移动语义(std::move)和完美转发(std::forward)详解