移动语义以及它是如何工作的?

问题描述

是否有用于移动而不是 std::move() 的语言语法? std::move() 是如何工作的?@H_404_5@

在五规则中,我必须定义移动构造函数。@H_404_5@

使用 std::move()代码@H_404_5@

#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,它允许代码将数据从一个对象移动到另一个对象,而不是复制数据,因为执行移动后,右值引用的目标将不再关心数据。

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 v2leavingv2empty. There is only 1 physical array being allocated in memory,pointers to it are simply being moved around from onevector` 到另一个.

在五个规则中我必须定义移动构造函数,最佳实践是什么?

移动你需要的东西,让源对象处于“稳定但未指定”的状态。这只是一种奇特的说法:窃取源对象的数据,并确保源对象不会因为窃取而处于崩溃或其他未指定行为的状态。在最典型的情况下,这意味着将被盗的指针/句柄设置为 nullptr/0。