![]() |
1
214
Wikipedia Page on C++11 R-value references and move constructors
这是一种避免拷贝的新C++方法。例如,使用移动构造函数,
尝试谷歌搜索移动语义,右值,完美转发。 |
![]() |
2
133
1。这是什么?”
同时
2。它是做什么的?”
首先要注意的是
换句话说,当你使用
您也可以从 prvalue (比如你临时路过),但这很少有用。 3。什么时候使用?”问这个问题的另一种方法是“我会为什么而蚕食现有对象的资源?”好吧,如果您正在编写应用程序代码,您可能不会在编译器创建的临时对象上浪费太多时间。因此,主要是在构造函数、运算符方法、标准库算法(如函数等)等对象自动创建和销毁的地方执行此操作。当然,这只是一个经验法则。 典型的用法是将资源从一个对象“移动”到另一个对象,而不是复制。@Guillaume链接到 this page 它有一个简单的例子:交换两个对象而不需要复制。
使用“移动”可以交换资源,而不是复制它们:
想想当t是,比如,
|
![]() |
3
127
当需要在其他地方“传输”对象的内容时,可以使用move,而不需要进行复制(例如,内容不重复,这就是为什么可以在某些不可复制的对象上使用它,例如唯一的指针)。使用std::move,对象还可以在不进行复制(并节省大量时间)的情况下获取临时对象的内容。 这个链接真的帮助了我: http://thbecker.net/articles/rvalue_references/section_01.html 如果我的回答太晚了,我很抱歉,但我也在为std::move寻找一个好的链接,我发现上面的链接有点“严肃”。 这将重点放在R值引用上,在这种情况下您应该使用它们,我认为它更详细,这就是为什么我想在这里共享这个链接。 |
![]() |
4
40
问:什么是
|
![]() |
5
28
移动本身并没有多大作用。我认为它调用了对象的移动构造函数,但实际上它只是执行类型转换(将左值变量强制转换为右值,以便将所述变量作为参数传递给移动构造函数或赋值运算符)。 所以std::move只是作为使用move语义的前兆。移动语义本质上是处理临时对象的有效方法。
考虑对象
这是好看的代码,但E+F生成一个临时对象。然后d+temp生成另一个临时对象,依此类推。在类的每个普通“+”运算符中,都会出现深度复制。 例如
在这个函数中创建临时对象是无用的-这些临时对象一旦超出范围,将在行尾被删除。 我们更愿意使用移动语义来“掠夺”临时对象,并做类似的事情
这样就避免了不必要的深度复制。关于这个例子,唯一发生深度复制的部分现在是e+f,其余部分使用移动语义。还需要实现move构造函数或赋值运算符来将结果赋给。 |
![]() |
6
2
我举个例子
例如,我们有一个类,其中包含大量资源,比如大数组。
测试代码:
输出如下:
我们可以看到
std::move还有什么用处? std::move在对元素数组排序时也很有用。许多排序算法(如选择排序和气泡排序)通过交换成对的元素来工作。在之前,我们必须使用复制语义来进行交换。现在我们可以使用移动语义,这是更有效的。 如果我们想将由一个智能指针管理的内容移到另一个智能指针管理的内容,它也很有用。 被引者 |
![]() |
apetrai · 我应该如何假设算法使用哪种迭代器类别? 3 年前 |
![]() |
ridiculous_fish · std::是否保证短路? 3 年前 |
![]() |
Fabio · 在c中将指针赋给常数指针++ 3 年前 |
![]() |
johnco3 · 初始化固定C数组成员结构 7 年前 |
![]() |
mans · 为什么出现此错误:constexpr在此处无效 7 年前 |
![]() |
juztcode · 在C++中尝试捕获-创建了多少个对象 7 年前 |
![]() |
Steven Scott · 忽略元素的基于范围的for循环 7 年前 |