场景1:
move(obj)函数的功能是把obj当做右值处理,可以应用在对象的移动上。
注意,如果仅仅是定义右值引用,那么obj本身不会被移走,在作为参数时会发生obj被移走:
string str = "test";
string&& r = move(str);
cout<< r <<endl;
cout<< str <<endl;
string t(r);
cout<< t <<endl;
cout<< str <<endl;
system("pause");
输出结果:
如果在参数中使用move()包裹:
string str = "test";
string&& r = move(str);
cout<< r <<endl;
cout<< str <<endl;
string t(move(r));
cout<< t <<endl;
cout<< str <<endl;
system("pause");
输出结果:
可以看到str已经变成空值了。
解释如下:c++ move函数到底是什么意思? - 知乎
在函数内部的形参,即使它被声明为右值引用类型,并被绑定一个右值引用类型的实参,但它本身仍然是左值,无法由它触发移动XX函数,除非对它再次使用move函数或者forward函数。因此,如果你在移动构造函数里面想要再次触发移动语义,那么就必须放在move里用,比如移动构造函数的入参对象里面有个string类型的成员变量,想移动到*this对象的对应string成员变量,就得包在move里面;
场景2:
此外,move()配合push_back()函数使用,可以降低开销!
示例:
vector<string> test1;
vector<string> test2;
clock_t start,end;
start = clock();
for(int i = 0; i < 1000000; ++i) {
string str = "abcdefg";
test1.push_back(str);
}
end = clock();
cout<<"time1 = "<<double(end-start)<<"ms"<<endl; //输出时间(单位:ms)
start = clock();
for(int i = 0; i < 1000000; ++i) {
string str = "abcdefg";
test2.push_back(move(str));
}
end = clock();
cout<<"time2 = "<<double(end-start)<<"ms"<<endl; //输出时间(单位:ms)
system("pause");
输出结果可能为:
可以看到,加了move函数的速度明显快于不加move函数,需要注意的是加了move函数之后str会被清空(正如场景1所述)。