首先我粗淺的認(rèn)為同時(shí)存在沒有問題,因?yàn)橐粋€(gè)是創(chuàng)建一個(gè)變量副本一個(gè)轉(zhuǎn)移一個(gè)生存周期將到的變量所申請的資源環(huán)境g++.exe(Rev2,BuiltbyMSYS2project)9.2.0g++.exe(x86_64-posix-seh-rev0,BuiltbyMinGW-W64project)8.1.0實(shí)驗(yàn)sf抽風(fēng),源碼見http://code.bulix.org/k07gcm-891664A(?const?A&?c?)&A(?A&&?c?)同時(shí)存在的輸出this:0x66f880@A()0申請內(nèi)存:0x732760this:0x737d50@A(A&&c)0移動(dòng)內(nèi)存:0x732760this:0x66f880@~A()0被移動(dòng)內(nèi)存:0this:0x66f880@A()1申請內(nèi)存:0x737d70this:0x737dc0@A(A&&c)1移動(dòng)內(nèi)存:0x737d70this:0x737db0@A(constA&c)99//???this:0x737d500申請內(nèi)存:0x737de0this:0x737d50@~A()0釋放內(nèi)存:0x732760this:0x66f880@~A()1被移動(dòng)內(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?)時(shí)的輸出this:0x66f880@A()0申請內(nèi)存:0x1f2760this:0x1f7d50@A(A&&c)0移動(dòng)內(nèi)存:0x1f2760this:0x66f880@~A()0被移動(dòng)內(nèi)存:0this:0x66f880@A()1申請內(nèi)存:0x1f7d70this:0x1f7dc0@A(A&&c)1移動(dòng)內(nèi)存:0x1f7d70this:0x1f7db0@A(A&&c)0移動(dòng)內(nèi)存:0x1f2760this:0x1f7d50@~A()0被移動(dòng)內(nèi)存:0this:0x66f880@~A()1被移動(dòng)內(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移動(dòng)內(nèi)存:0x1f2760this:0x66f880@~A()0被移動(dòng)內(nèi)存:0這個(gè)應(yīng)該是push_back的源碼push_back(value_type&&?__x){?emplace_back(std::move(__x));?}為什么只調(diào)一次移動(dòng)構(gòu)造函數(shù),被優(yōu)化了?+------------------------------+|在這里創(chuàng)建變量|+------------------------------+vect.push_back(std::move(a));+------------------------------+|調(diào)用移動(dòng)構(gòu)造函數(shù)|+------------------------------+emplace_back(std::move(__x));//
c++ 拷貝構(gòu)造和移動(dòng)構(gòu)造同時(shí)存在 導(dǎo)致 move 的行為差異
紅糖糍粑
2019-10-16 10:30:13