声明左值变量后无需保留时,传递至函数是否必须使用std::move?
左值变量转存vector,到底要不要用std::move?
咱们先把核心结论摆出来:如果你有个已经声明好的左值变量(比如你说的string),后续再也不用它了,还想避免拷贝把它塞进vector里——必须用std::move,没跑儿。
为啥非得用std::move?
C++这玩意儿默认认死理:你传左值(比如直接写变量名),它就会老老实实做拷贝构造。举个例子,要是你直接调用add(my_str),函数里的参数s会复制一份my_str的所有字符,大字符串的话这开销可不小,完全没必要。
但你用std::move(my_str)就不一样了,它相当于给编译器递了个话:“这变量我不用了,你直接把它的资源挪走就行!”这时候编译器会触发移动语义——说白了就是把原变量内部的指针啥的直接转移给新对象,几乎没开销。原变量会变成“有效但不能用”的状态,刚好符合你后续不再用它的需求。
聊聊你给的示例函数
你写的这个函数:
void add(string s){ my_vector.push_back(move(s)); }
本身没毛病,但还能再优化一步:把参数改成右值引用,省掉一次移动操作:
void add(string&& s){ my_vector.push_back(move(s)); }
调用的时候还是得用std::move(my_str)传参,这样直接把s的资源挪进vector,全程就一次移动,效率拉满。
或者更干脆,直接跳过封装函数,用vector的emplace_back:
my_vector.emplace_back(std::move(my_str));
它会直接在vector的内存里构造string对象,一步到位,连中间参数的传递都省了。
最后提个醒
用了std::move之后,原变量可千万别再用了啊!它的内部资源已经被掏空了,再用容易出幺蛾子。要是你后续还得用这个变量,那老老实实拷贝吧,别折腾移动了。
内容的提问来源于stack exchange,提问作者user4222907
相关产品推荐
相关产品推荐

