猿问

c++ 拷贝构造和移动构造同时存在 导致 move 的行为差异

首先我粗浅的认为同时存在没有问题,因为
一个是创建一个变量副本
一个转移一个生存周期将到的变量所申请的资源
环境
g++.exe(Rev2,BuiltbyMSYS2project)9.2.0
g++.exe(x86_64-posix-seh-rev0,BuiltbyMinGW-W64project)8.1.0
实验
sf抽风,源码见http://code.bulix.org/k07gcm-891664
A( const A& c )&A( A&& c )同时存在的输出
this:0x66f880@A()0
申请内存:0x732760
this:0x737d50@A(A&&c)0
移动内存:0x732760
this:0x66f880@~A()0
被移动内存:0
this:0x66f880@A()1
申请内存:0x737d70
this:0x737dc0@A(A&&c)1
移动内存:0x737d70
this:0x737db0@A(constA&c)99//???
this:0x737d500
申请内存:0x737de0
this:0x737d50@~A()0
释放内存:0x732760
this:0x66f880@~A()1
被移动内存:0
over
0x737db0:99//???
0x737dc0:1
this:0x737db0@~A()99
释放内存:0x737de0
this:0x737dc0@~A()1
释放内存:0x737d70
可见调用了拷贝构造函数,这是不是内部没有使用std::move导致调用拷贝构造函数?(瞎猜)
只有A( A&& c )时的输出
this:0x66f880@A()0
申请内存:0x1f2760
this:0x1f7d50@A(A&&c)0
移动内存:0x1f2760
this:0x66f880@~A()0
被移动内存:0
this:0x66f880@A()1
申请内存:0x1f7d70
this:0x1f7dc0@A(A&&c)1
移动内存:0x1f7d70
this:0x1f7db0@A(A&&c)0
移动内存:0x1f2760
this:0x1f7d50@~A()0
被移动内存:0
this:0x66f880@~A()1
被移动内存:0
over
0x1f7db0:0
0x1f7dc0:1
this:0x1f7db0@~A()0
释放内存:0x1f2760
this:0x1f7dc0@~A()1
释放内存:0x1f7d70
问题2
classAa(2);
vect.push_back(std::move(a));
输出
this:0x66f880@A()0
申请内存:0x1f2760
this:0x1f7d50@A(A&&c)0
移动内存:0x1f2760
this: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));//<<<
+------------------------------+
|push_back内部也有move|
|为什么不会再次调用移动构造|
|函数|
+------------------------------+
红糖糍粑
浏览 962回答 2
2回答
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答