c++ - 移动语义及其工作原理?
问题描述
是否有用于 move 而不是 的语言语法std::move()
?以及如何std::move()
工作?
在五规则中,我必须定义移动构造函数。
代码使用std::move()
#include <cstdio>
#include <vector>
#include <string>
#include <utility>
using namespace std;
int main() {
vector<string> v1 = { "one", "two", "three", "four", "five" };
vector<string> v2 = { "six", "seven", "eight", "nine", "ten" };
auto v3 = std::move(v2);
return 0;
}
解决方案
是否有移动的语言语法而不是
std::move
不。唯一与移动相关的语言语法是rvalue references,它允许代码将数据从一个对象移动到另一个对象而不是复制数据,因为 rvalue 引用的目标不再需要关心数据移动完成后。
以及如何
std::move
工作?
std::move()
只是将左值引用类型转换为右值引用,仅此而已。接收右值引用的代码负责根据需要实际移动数据。使用std::move()
并不能保证实际会执行移动。它只是提供对通常不是右值的对象执行移动的权限。
在您的示例中,std::move(v2)
强制转换v2
为vector<string>&&
右值引用,并将其分配给v3
. 没有执行任何实际移动,因为v3
它只是一个没有用于任何事情的参考。一个更有意义的例子是:
vector<string> v1 = { "one", "two", "three", "four", "five" };
vector<string> v2(std::move(v1));
vector<string> v3;
v3 = std::move(v2);
std::vector
有一个移动构造函数和一个移动赋值运算符。在这种情况下,v2
将窃取数组v1
留空v1
,然后将v3 will steal the array from
v2 leaving
v2 empty. There is only 1 physical array being allocated in memory, pointers to it are simply being moved around from one
vector` 转移到另一个。
在五规则中我必须定义移动构造函数,最佳实践是什么?
移动您需要的东西,并使源对象处于“稳定但未指定”的状态。这只是一种奇特的说法:窃取源对象的数据,并确保源对象不会因为窃取而处于崩溃或其他未指定行为的状态。在大多数典型情况下,这意味着将被盗的指针/句柄设置为nullptr
/0。
推荐阅读
- vue.js - vue.js,使用 css 滚动快照时未触发 vuetify 滚动事件
- java - 读取值并通过 android 中的不同应用程序共享它
- laravel - 如何在 Eloquent 模型中以编程方式更改可填充变量实例?
- javascript - 如何将异步添加到谷歌云功能?
- ios - 在 collectionview 中以不同大小的网格格式显示图像
- c# - 使用 ArgumentValidator.VerifyNotNullOrEmpty 进行单元测试
- php - 使用 codeigniter 和 filepond 在数据库中插入多个图像
- python - 如何抓取维基百科信息框并将其存储到 csv 文件中
- powershell - 在 Powershell (Win 10) 中执行批处理不影响父 Shell
- ajax - 在laravel中单击按钮时如何增加DB中的计数值?