///////////////////////////////////////////////
我的注解
int &f(const int&a)
{
}
那么 f(3)可以.
int &f( int&a)
{
}
f(3)錯(cuò)誤.
函數(shù)調(diào)用時(shí)形參是實(shí)參的拷貝.
同樣考慮返回值.不能返回局部變量,而只能返回到一個(gè)臨時(shí)變量中.
臨時(shí)變量的值可能被丟棄,或者保存到一個(gè)生存期更長(zhǎng)的變量中.
從匯編講.
調(diào)用時(shí)將參數(shù)壓入棧頂, ======== 將實(shí)參拷貝到形參.
返回時(shí) 將返回值放到棧頂 ====== 將返回值放到臨時(shí)變量
返回后,棧指針恢復(fù),但棧頂?shù)呐R時(shí)變量仍在, 此時(shí)可將其拷貝到一個(gè)生存期更長(zhǎng)的變量中.
struct
o{
int
x;
int
y;
};
o f(){
int
i=0;
int
j=1;
o o1={30};
int
k=2;
int
l=3;
return
o1;
};
將創(chuàng)建兩個(gè)o對(duì)象.一個(gè)是o1,一個(gè)是在棧頂創(chuàng)建返回的臨時(shí)變量.
s foo(){
int
i=0;
int
j=1;
int
k=2;
int
l=3;
printf
(
"foo returns\n"
);
return
o(44,55);
};
將只創(chuàng)建一次o對(duì)象.
o o2=f(); // 調(diào)用f函數(shù),系統(tǒng)會(huì)在運(yùn)行時(shí)棧上開辟一數(shù)據(jù)結(jié)構(gòu)的內(nèi)存(活動(dòng)記錄),同時(shí)指針指向了該活動(dòng)記錄。
該活動(dòng)記錄中存放有函數(shù)返回的地址和返回值、局部變量等數(shù)據(jù)成員。
當(dāng)函數(shù)返回時(shí),系統(tǒng)會(huì)pop該活動(dòng)記錄,但這僅是“邏輯”上的刪除,物理上數(shù)據(jù)還在那,在回到Main數(shù)時(shí),還是可以訪問返回值的。
return value optimization (RVO) 因?yàn)槟阍趓eturn時(shí)才會(huì)創(chuàng)建這個(gè)對(duì)象 那么這個(gè)對(duì)象在這個(gè)函數(shù)體內(nèi)就不會(huì)再被使用了
編譯器可以直接用那個(gè)臨時(shí)變量的空間創(chuàng)建這個(gè)對(duì)象 不需要再額外多創(chuàng)建一份.
Mytime operator *( double i ) const // 生成臨時(shí)對(duì)象
//編譯器會(huì)產(chǎn)生臨時(shí)對(duì)象,并且調(diào)用拷貝構(gòu)造函數(shù)初始化,執(zhí)行完這個(gè)語(yǔ)句后,臨時(shí)對(duì)象自動(dòng)釋放。
//所以產(chǎn)生臨時(shí)對(duì)象有構(gòu)造和析構(gòu)的時(shí)間開銷。
Mytime& operator *( double i ) const // 不生成臨時(shí)對(duì)象
一般對(duì)于拷貝構(gòu)造函數(shù),可以想像,不應(yīng)該能修改被拷貝的對(duì)象.因此要求輸入?yún)?shù)是const &,
如果拷貝構(gòu)造函數(shù)的輸入?yún)?shù)是一個(gè)臨時(shí)對(duì)象呢?
如果被拷貝對(duì)象擁有大量資源,那么可見返回的對(duì)象也需要擁有相應(yīng)的資源.
如果被拷貝對(duì)象在被拷貝后,就不存在了,那么它就需要隨后釋放相應(yīng)的資源.
顯然如果能把其擁有的資源直接移動(dòng)交換給返回的拷貝對(duì)象,
而不是一方面對(duì)拷貝對(duì)象重新分配資源,而被拷貝對(duì)象又馬上釋放資源,能大幅提高效率.
那么拷貝構(gòu)造函數(shù)的輸入?yún)?shù)到底能否被修改,與輸入?yún)?shù)是否是臨時(shí)的右值對(duì)象有關(guān).
需要兩種不同的拷貝構(gòu)造函數(shù).
那么可以根據(jù)輸入?yún)?shù)是否是臨時(shí)的右值對(duì)象,進(jìn)行重載處理.
輸入?yún)?shù)是右值引用,表示其是臨時(shí)的右值對(duì)象,可以被修改..
輸入?yún)?shù)是const 左值應(yīng)用,表示其不能被修改.
編譯器根據(jù)輸入?yún)?shù)的類型,選擇合適的函數(shù)調(diào)用.
聯(lián)系客服