一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

右值引用

 quasiceo 2012-11-23

///////////////////////////////////////////////

我的注解

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í)棧上開(kāi)辟一數(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í),還是可以訪問(wèn)返回值的。

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í)間開(kāi)銷。

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ì)象擁有大量資源,那么可見(jiàn)返回的對(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)用.

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    欧美午夜一级特黄大片| 亚洲国产一区精品一区二区三区色| 在线欧洲免费无线码二区免费| 少妇熟女精品一区二区三区| 成年人黄片大全在线观看| 国产一级一片内射视频在线| 日韩欧美三级中文字幕| 欧美成人一区二区三区在线| 日本高清不卡一二三区| 亚洲一区二区久久观看| 日本人妻精品中文字幕不卡乱码| 五月情婷婷综合激情综合狠狠| 亚洲欧美日韩网友自拍| 九九热国产这里只有精品| 麻豆视传媒短视频在线看| 日韩一区二区三区在线日| 国产在线小视频你懂的| 99少妇偷拍视频在线| 九九热在线视频精品免费| 日韩在线一区中文字幕| 很黄很污在线免费观看| 国产成人精品视频一二区| 亚洲婷婷开心色四房播播| 国产亚洲系列91精品| 午夜资源在线观看免费高清| 亚洲国产av国产av| 色婷婷国产熟妇人妻露脸| 日本久久精品在线观看| 欧美做爰猛烈叫床大尺度| 日本最新不卡免费一区二区| 黄色片一区二区在线观看| 亚洲a码一区二区三区| 欧美日韩亚洲巨色人妻| 欧美一区二区日韩一区二区| 亚洲免费视频中文字幕在线观看 | 欧美黑人在线一区二区| 日韩毛片视频免费观看| 国产视频在线一区二区| 国产免费自拍黄片免费看| 国产又色又爽又黄的精品视频| 国产av乱了乱了一区二区三区|