首先我粗淺的認(rèn)為同時存在沒有問題,因為一個是創(chuàng)建一個變量副本一個轉(zhuǎn)移一個生存周期將到的變量所申請的資源環(huán)境g++.exe(Rev2,BuiltbyMSYS2project)9.2.0g++.exe(x86_64-posix-seh-rev0,BuiltbyMinGW-W64project)8.1.0實驗sf抽風(fēng),源碼見http://code.bulix.org/k07gcm-891664A(?const?A&?c?)&A(?A&&?c?)同時存在的輸出this:0x66f880@A()0申請內(nèi)存:0x732760this:0x737d50@A(A&&c)0移動內(nèi)存:0x732760this:0x66f880@~A()0被移動內(nèi)存:0this:0x66f880@A()1申請內(nèi)存:0x737d70this:0x737dc0@A(A&&c)1移動內(nèi)存:0x737d70this:0x737db0@A(constA&c)99//???this:0x737d500申請內(nèi)存:0x737de0this:0x737d50@~A()0釋放內(nèi)存:0x732760this:0x66f880@~A()1被移動內(nèi)存:0over0x737db0:99//???0x737dc0:1this:0x737db0@~A()99釋放內(nèi)存:0x737de0this:0x737dc0@~A()1釋放內(nèi)存:0x737d70可見調(diào)用了拷貝構(gòu)造函數(shù),這是不是內(nèi)部沒有使用std::move導(dǎo)致調(diào)用拷貝構(gòu)造函數(shù)?(瞎猜)只有A(?A&&?c?)時的輸出this:0x66f880@A()0申請內(nèi)存:0x1f2760this:0x1f7d50@A(A&&c)0移動內(nèi)存:0x1f2760this:0x66f880@~A()0被移動內(nèi)存:0this:0x66f880@A()1申請內(nèi)存:0x1f7d70this:0x1f7dc0@A(A&&c)1移動內(nèi)存:0x1f7d70this:0x1f7db0@A(A&&c)0移動內(nèi)存:0x1f2760this:0x1f7d50@~A()0被移動內(nèi)存:0this:0x66f880@~A()1被移動內(nèi)存:0over0x1f7db0:00x1f7dc0:1this:0x1f7db0@~A()0釋放內(nèi)存:0x1f2760this:0x1f7dc0@~A()1釋放內(nèi)存:0x1f7d70問題2classAa(2);vect.push_back(std::move(a));輸出this:0x66f880@A()0申請內(nèi)存:0x1f2760this:0x1f7d50@A(A&&c)0移動內(nèi)存:0x1f2760this:0x66f880@~A()0被移動內(nèi)存:0這個應(yīng)該是push_back的源碼push_back(value_type&&?__x){?emplace_back(std::move(__x));?}為什么只調(diào)一次移動構(gòu)造函數(shù),被優(yōu)化了?+------------------------------+|在這里創(chuàng)建變量|+------------------------------+vect.push_back(std::move(a));+------------------------------+|調(diào)用移動構(gòu)造函數(shù)|+------------------------------+emplace_back(std::move(__x));//
請教各位一個問題,求解答:c++ 拷貝構(gòu)造和移動構(gòu)造同時存在 導(dǎo)致 move 的行為差異各位有什么建議?
慕田峪9158850
2019-10-25 21:48:15