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

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

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

std::map<string, std::vector<int>> mapTable;

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

我之前是这么填充的:

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

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

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

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

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

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

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

总结

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

相关推荐

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

    2024-01-06 21:58:01       63 阅读
  2. C++ 核心编程 - 函数提高

    2024-01-06 21:58:01       41 阅读
  3. 为什么C++11还要复杂的提出右值引用?

    2024-01-06 21:58:01       31 阅读
  4. C++提高编程—01.函数模板

    2024-01-06 21:58:01       49 阅读
  5. C++提高编程——STL:函数对象

    2024-01-06 21:58:01       47 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-06 21:58:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-06 21:58:01       101 阅读
  3. 在Django里面运行非项目文件

    2024-01-06 21:58:01       82 阅读
  4. Python语言-面向对象

    2024-01-06 21:58:01       91 阅读

热门阅读

  1. uniapp知识大杂烩?

    2024-01-06 21:58:01       59 阅读
  2. 在Golang中如何配置WebSocket以使用wss

    2024-01-06 21:58:01       67 阅读
  3. 语音遥控器2-语音功能实现

    2024-01-06 21:58:01       59 阅读
  4. 判断上、下三角矩阵

    2024-01-06 21:58:01       61 阅读
  5. 算法:剪绳子

    2024-01-06 21:58:01       55 阅读
  6. python深度拷贝

    2024-01-06 21:58:01       65 阅读
  7. 面试算法94:最少回文分割

    2024-01-06 21:58:01       69 阅读
  8. docker 相关常用命令---持续更新

    2024-01-06 21:58:01       55 阅读
  9. log4j RCE漏洞原理分析及检测

    2024-01-06 21:58:01       53 阅读
  10. Leetcode14-判断句子是否为全字母句(1832)

    2024-01-06 21:58:01       66 阅读