什么时候用std::move()?
Posted PaQiuQiu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么时候用std::move()?相关的知识,希望对你有一定的参考价值。
文章目录
1. “是什么?”
虽然 std::move()
从技术角度上是一个函数 ,但我认为它不是真正的函数。 它是编译器考虑表达式值的方式之间的转换器。
2. “有何用?”
首先要注意的是 std::move()
实际上没有移动任何东西。 它将表达式从左值(例如以及命名的变量)更改为 xvalue
。 xvalue
告诉编译器:
你可以掠夺我,移动我持有的任何东西并在别处使用它(因为我很快就会被摧毁)”。
换句话说,当您使用 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()?的主要内容,如果未能解决你的问题,请参考以下文章