C++为什么提供std::move函数?

我想说一下一个我的个人经历

有一段代码,作用是把数据库表保存到XML文件。这个转换的过程,有个中间容器,大概是这样:

std::map> mapTable;

可以理解为map的key是数据表的列名,std::vector是那列数据(一行一行的)。

我之前是这么填充的:

std::vector vecRow;
for(){
	vecRow.push_back(...);
}
mapTable["列名1"] = vecRow;

codereview的时候就发现了这个事情:本质上上述代码,把vecRow中的所有元素都复制了以便然后放到mapTable中,白白的重新创建了一遍所有行数据,又把不再需要的vecRow释放掉了。这样就很蠢。

改进:当我们知道vecRow生命(作用域后),我们可以利用这个vecRow,在std::move之前,还是有办法的,创建vecRow 的时候就让它是mapTable里某列的引用,如下:

std::vector &vecRow = mapTable["列名1"];
for(){
	vecRow.push_back(...);
}

但是考虑到这样的话会改动别的代码,所以使用std::move是最好的

mapTable["列名1"]= std::move(vecRow);

就这么一点点改动,就能让vecRow里的东西放进mapTable里,又没避免大规模创建、析构对象。执行完上面的函数,应该会发现vecRow空了。

总结

其实编译器已经在力所能及的优化他能够优化的东西了,但是编译器的优化不是万能的。有时候某个变量的生命周期编译器不可预见,但是我们自己是可以知道的,因此对于这些生命周期很短的变量我们为了节省效率就可以使用move函数。举个例子:比如黄金交易,张三买了李四的黄金,就应该把黄金从李四家移动到张三家里。但如果黄金量很大,移动的成本就会非常高。另一种方式就是大家的黄金都存在银行里,张三买李四的黄金,无非就是账户里的黄金数发生个变化,实体黄金不移动,这样效率就高很多。至于"为什么管理机构(编译器)不优化全世界的黄金交易为纸上黄金交易?",那是因为真的有人需要搬黄金回家用啊

你可能感兴趣的:(c++,开发语言)