什么时候用std::move()?
创始人
2024-05-26 22:01:18

文章目录

      • 1. "是什么?"
      • 2. "有何用?"
      • 3. "什么时候用?"

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 
swap(T& a, T& b) {T tmp(a);   // we now have two copies of aa = 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 
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

相关内容

热门资讯

苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...