场景1:
move(obj)函数的功能是把obj当做右值处理,可以应用在对象的移动上。
注意,如果仅仅是定义右值引用,那么obj本身不会被移走,在作为参数时会发生obj被移走:
string str = "test"; string&& r = move(str); cout<< r <输出结果:
如果在参数中使用move()包裹:
string str = "test"; string&& r = move(str); cout<< r <输出结果:
可以看到str已经变成空值了。
解释如下:c++ move函数到底是什么意思? - 知乎
在函数内部的形参,即使它被声明为右值引用类型,并被绑定一个右值引用类型的实参,但它本身仍然是左值,无法由它触发移动XX函数,除非对它再次使用move函数或者forward函数。因此,如果你在移动构造函数里面想要再次触发移动语义,那么就必须放在move里用,比如移动构造函数的入参对象里面有个string类型的成员变量,想移动到*this对象的对应string成员变量,就得包在move里面;
场景2:
此外,move()配合push_back()函数使用,可以降低开销!
示例:
vectortest1; vector 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 = "< 输出结果可能为:
可以看到,加了move函数的速度明显快于不加move函数,需要注意的是加了move函数之后str会被清空(正如场景1所述)。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)