为了账号安全,请及时绑定邮箱和手机立即绑定

请教各位一个问题,求解答:c++ 拷贝构造和移动构造同时存在 导致 move 的行为差异各位有什么建议?

请教各位一个问题,求解答:c++ 拷贝构造和移动构造同时存在 导致 move 的行为差异各位有什么建议?

慕田峪9158850 2019-10-25 21:48:15
首先我粗浅的认为同时存在没有问题,因为一个是创建一个变量副本一个转移一个生存周期将到的变量所申请的资源环境g++.exe(Rev2,BuiltbyMSYS2project)9.2.0g++.exe(x86_64-posix-seh-rev0,BuiltbyMinGW-W64project)8.1.0实验sf抽风,源码见http://code.bulix.org/k07gcm-891664A( const A& c )&A( A&& c )同时存在的输出this:0x66f880@A()0申请内存:0x732760this:0x737d50@A(A&&c)0移动内存:0x732760this:0x66f880@~A()0被移动内存:0this:0x66f880@A()1申请内存:0x737d70this:0x737dc0@A(A&&c)1移动内存:0x737d70this:0x737db0@A(constA&c)99//???this:0x737d500申请内存:0x737de0this:0x737d50@~A()0释放内存:0x732760this:0x66f880@~A()1被移动内存:0over0x737db0:99//???0x737dc0:1this:0x737db0@~A()99释放内存:0x737de0this:0x737dc0@~A()1释放内存:0x737d70可见调用了拷贝构造函数,这是不是内部没有使用std::move导致调用拷贝构造函数?(瞎猜)只有A( A&& c )时的输出this:0x66f880@A()0申请内存:0x1f2760this:0x1f7d50@A(A&&c)0移动内存:0x1f2760this:0x66f880@~A()0被移动内存:0this:0x66f880@A()1申请内存:0x1f7d70this:0x1f7dc0@A(A&&c)1移动内存:0x1f7d70this:0x1f7db0@A(A&&c)0移动内存:0x1f2760this:0x1f7d50@~A()0被移动内存:0this:0x66f880@~A()1被移动内存:0over0x1f7db0:00x1f7dc0:1this:0x1f7db0@~A()0释放内存:0x1f2760this:0x1f7dc0@~A()1释放内存:0x1f7d70问题2classAa(2);vect.push_back(std::move(a));输出this:0x66f880@A()0申请内存:0x1f2760this:0x1f7d50@A(A&&c)0移动内存:0x1f2760this:0x66f880@~A()0被移动内存:0这个应该是push_back的源码push_back(value_type&& __x){ emplace_back(std::move(__x)); }为什么只调一次移动构造函数,被优化了?+------------------------------+|在这里创建变量|+------------------------------+vect.push_back(std::move(a));+------------------------------+|调用移动构造函数|+------------------------------+emplace_back(std::move(__x));//
查看完整描述

2 回答

  • 2 回答
  • 0 关注
  • 619 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信