当前位置:   article > 正文

c++ move的作用和用法

c++ move的作用和用法

参考http://www.cnblogs.com/taiyang-li/p/5894607.html

std::move 会无条件将自己的参数转换为右值。在对象拷贝的时候,在运行时,它们不会产生一行代码, 可以减少资源创建和释放。

  1. //
  2. // main.cpp
  3. // move
  4. //
  5. // Created by 蓝猫 on 2019/1/3.
  6. // Copyright © 2019年 蓝猫. All rights reserved.
  7. //
  8. /*
  9. 3. 为什么要使用std::move
  10.   如果类X包含一个指向某资源的指针,在左值语义下,类X的赋值构造函数如下:
  11. 复制代码
  12. X::X(const X& other)
  13. {
  14. // ....
  15. // 销毁资源
  16. // 复制other的资源,并使指针指向它
  17. // ...
  18. }
  19. 复制代码
  20.   应用代码如下,其中,tmp被赋给a之后,便不再使用。
  21. X tmp;
  22. // ...经过一系列初始化...
  23. X a = tmp;
  24.   如上,执行过程按照时间顺序如下: 首先执行一次默认构造函数(tmp申请资源),再执行一次复制构造函数(a复制资源), 最后退出作用域时再执行一次析构函数(tmp释放资源)。既然tmp迟早要被析构掉,在执行复制构造函数的时候,a能不能将tmp的资源“偷“”过来,直接为我所用?
  25. X::X(const X& other)
  26. {
  27. // 交换this和other的资源
  28. }
  29.   这样可以减少一次资源的创建和释放。这就是std::move所要实现的。
  30. */
  31. #include <utility>
  32. #include <iostream>
  33. #include <string>
  34. #include <vector>
  35. void foo(const std::string& n)
  36. {
  37. std::cout << "lvalue" << std::endl;
  38. }
  39. void foo(std::string&& n)
  40. {
  41. std::cout << "rvalue" << std::endl;
  42. }
  43. void bar()
  44. {
  45. foo("hello"); // rvalue 右值(只能在右边出现)
  46. std::string a = "world";
  47. foo(a); // lvalue(左值)
  48. foo(std::move(a)); // rvalue(强行转换)
  49. }
  50. int main()
  51. {
  52. std::vector<std::string> a = {"hello", "world"};
  53. std::vector<std::string> b;
  54. b.push_back("hello");
  55. b.push_back(std::move(a[1]));
  56. std::cout << "bsize: " << b.size() << std::endl;
  57. for (std::string& x: b)
  58. std::cout << x << std::endl;
  59. bar();
  60. return 0;
  61. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/640092
推荐阅读
相关标签
  

闽ICP备14008679号