999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

理解C++中臨時(shí)對(duì)象的來源

2012-04-29 00:44:03郝亞洲李文敏

郝亞洲 李文敏

在學(xué)習(xí)計(jì)算機(jī)語言諸如C++之類的時(shí)候,經(jīng)常會(huì)遇到一個(gè)詞匯—“臨時(shí)對(duì)象”,這個(gè)概念很多初學(xué)者在學(xué)習(xí)了很長(zhǎng)時(shí)間計(jì)算機(jī)語言之后還是不能很好的理解它的含義和它背后隱藏的真實(shí)實(shí)現(xiàn)是什么,該文通過實(shí)例探討了臨時(shí)對(duì)象的特點(diǎn)和特性,對(duì)理解計(jì)算機(jī)語言中這一較難的概念有很大的幫助和啟發(fā)。

C++;臨時(shí)變量;臨時(shí)對(duì)象

當(dāng)程序員之間進(jìn)行交談時(shí),他們經(jīng)常把僅僅需要一小段時(shí)間的變量稱為臨時(shí)變量。例如在下面這段swap(交換)例程里:

在C++中真正的臨時(shí)對(duì)象是看不見的,它們不出現(xiàn)在你的源代碼中。建立一個(gè)沒有命名的非堆(non-heap)對(duì)象會(huì)產(chǎn)生臨時(shí)對(duì)象。這種未命名的對(duì)象通常在兩種條件下產(chǎn)生:為了使函數(shù)成功調(diào)用而進(jìn)行隱式類型轉(zhuǎn)換和函數(shù)返回對(duì)象時(shí)。理解如何和為什么建立這些臨時(shí)對(duì)象是很重要的,因?yàn)闃?gòu)造和釋放它們的開銷對(duì)于程序的性能來說有著不可忽視的影響。

首先考慮為使函數(shù)成功調(diào)用而建立臨時(shí)對(duì)象這種情況。當(dāng)傳送給函數(shù)的對(duì)象類型與參數(shù)類型不匹配時(shí)會(huì)產(chǎn)生這種情況。例如一個(gè)函數(shù),它用來計(jì)算一個(gè)字符在字符串中出現(xiàn)的次數(shù):

//返回ch在str中出現(xiàn)的次數(shù)

看一下count Char的調(diào)用。第一個(gè)被傳送的參數(shù)是字符數(shù)組,但是對(duì)應(yīng)函數(shù)的正被綁定的參數(shù)的類型是const string&。僅當(dāng)消除類型不匹配后,才能成功進(jìn)行這個(gè)調(diào)用,你的編譯器很樂意替你消除它,方法是建立一個(gè)string類型的臨時(shí)對(duì)象。通過以buffer做為參數(shù)調(diào)用string的構(gòu)造函數(shù)來初始化這個(gè)臨時(shí)對(duì)象。count Char的參數(shù)str被綁定在這個(gè)臨時(shí)的string對(duì)象上。當(dāng)count Char返回時(shí),臨時(shí)對(duì)象自動(dòng)釋放。

這樣的類型轉(zhuǎn)換很方便(盡管很危險(xiǎn)-參見條款M5),但是從效率的觀點(diǎn)來看,臨時(shí)string對(duì)象的構(gòu)造和釋放是不必要的開銷。通常有兩個(gè)方法可以消除它。一種是重新設(shè)計(jì)你的代碼,不讓發(fā)生這種類型轉(zhuǎn)換。這種方法在條款M5中被研究和分析。另一種方法是通過修改軟件而不再需要類型轉(zhuǎn)換,條款M21講述了如何去做。

僅當(dāng)通過傳值(by value)方式傳遞對(duì)象或傳遞常量引用(reference-to-const)參數(shù)時(shí),才會(huì)發(fā)生這些類型轉(zhuǎn)換。當(dāng)傳遞一個(gè)非常量引用(reference-to-non-const)參數(shù)對(duì)象,就不會(huì)發(fā)生??紤]一下這個(gè)函數(shù):void uppercasify(string& str);//把str中所有的字符//改變成大寫。在字符計(jì)數(shù)的例子里,能夠成功傳遞char數(shù)組到count Char中,但是在這里試圖用char數(shù)組調(diào)用upeercasify函數(shù),則不會(huì)成功:

char subtle Book Plug[]="Effective C++";uppercasify(subtle Book Plug);//錯(cuò)誤!

沒有為使調(diào)用成功而建立臨時(shí)對(duì)象,為什么呢?

假設(shè)建立一個(gè)臨時(shí)對(duì)象,那么臨時(shí)對(duì)象將被傳遞到upeercasify中,其會(huì)修改這個(gè)臨時(shí)對(duì)象,把它的字符改成大寫。但是對(duì)subtle Book Plug函數(shù)調(diào)用的真正參數(shù)沒有任何影響;僅僅改變了臨時(shí)從subtle Book Plug生成的string對(duì)象。無疑這不是程序員所希望的。程序員傳遞subtle Book Plug參數(shù)到uppercasify函數(shù)中,期望修改subtle Book Plug的值。當(dāng)程序員期望修改非臨時(shí)對(duì)象時(shí),對(duì)非常量引用(references-to-non-const)進(jìn)行的隱式類型轉(zhuǎn)換卻修改臨時(shí)對(duì)象。這就是為什么C++語言禁止為非常量引用(reference-to-non-const)產(chǎn)生臨時(shí)對(duì)象。這樣非常量引用(reference-to-non-const)參數(shù)就不會(huì)遇到這種問題。

建立臨時(shí)對(duì)象的第二種環(huán)境是函數(shù)返回對(duì)象時(shí)。例如operator+必須返回一個(gè)對(duì)象,以表示它的兩個(gè)操作數(shù)的和(參見Effective C++條款23)。例如給定一個(gè)類型Number,這種類型的operator+被這樣聲明:const Number operator+(const Number& lhs, const Number& rhs);

這個(gè)函數(shù)的返回值是臨時(shí)的,因?yàn)樗鼪]有被命名;它只是函數(shù)的返回值。你必須為每次調(diào)用operator+構(gòu)造和釋放這個(gè)對(duì)象而付出代價(jià)。(有關(guān)為什么返回值是const的詳細(xì)解釋,參見Effective C++條款21)

通常你不想付出這樣的開銷。對(duì)于這種函數(shù),你可以切換到operator=,而避免開銷。條款M22告訴我們進(jìn)行這種轉(zhuǎn)換的方法。不過對(duì)于大多數(shù)返回對(duì)象的函數(shù)來說,無法切換到不同的函數(shù),從而沒有辦法避免構(gòu)造和釋放返回值。至少在概念上沒有辦法避免它。然而概念和現(xiàn)實(shí)之間又一個(gè)黑暗地帶,叫做優(yōu)化,有時(shí)你能以某種方法編寫返回對(duì)象的函數(shù),以允許你的編譯器優(yōu)化臨時(shí)對(duì)象。這些優(yōu)化中,最常見和最有效的是返回值優(yōu)化,這是條款M20的內(nèi)容。

綜上所述,臨時(shí)對(duì)象是有開銷的,所以你應(yīng)該盡可能地去除它們,然而更重要的是訓(xùn)練自己尋找可能建立臨時(shí)對(duì)象的地方。在任何時(shí)候只要見到常量引用(reference-to-const)參數(shù),就存在建立臨時(shí)對(duì)象而綁定在參數(shù)上的可能性。在任何時(shí)候只要見到函數(shù)返回對(duì)象,就會(huì)有一個(gè)臨時(shí)對(duì)象被建立(以后被釋放)。學(xué)會(huì)尋找這些對(duì)象構(gòu)造,你就能顯著地增強(qiáng)透過編譯器表面動(dòng)作而看到其背后開銷的能力。

本文通過實(shí)例對(duì)臨時(shí)對(duì)象這個(gè)概念做了簡(jiǎn)明清晰的闡述,使得讀者對(duì)這個(gè)概念的理解更加理性和深入,并且用一個(gè)個(gè)例子實(shí)實(shí)在在地回答了了臨時(shí)對(duì)象究竟是什么,它的來源是什么這兩個(gè)基本問題,對(duì)于廣大計(jì)算機(jī)語言初學(xué)者有著很積極的意義。

[1]Stanley B. Lippman, Josee Lajoie, Barbara E. Moo C++ Primer[M].Addison-Wesley Educational Publishers Inc,2005.02

[2]Brian W. Kernighan, Dennis M. Ritchie. The C ++ programming language[M].Prentice Hall,1989.01

[3]Stanley B. Lippman,侯捷.深入探索C++對(duì)象模型[M].武漢:華中科技大學(xué)出版社,2007.05

主站蜘蛛池模板: 亚洲AⅤ波多系列中文字幕| 四虎永久免费地址在线网站| 99精品高清在线播放| 无码福利视频| 在线另类稀缺国产呦| AV不卡无码免费一区二区三区| 国产成人亚洲精品无码电影| 欧美日韩在线国产| 看av免费毛片手机播放| 99这里精品| 国产丰满大乳无码免费播放| 精品久久久久久中文字幕女| 在线国产欧美| 国产精品手机在线观看你懂的| 亚洲天堂区| 97在线公开视频| 国产福利观看| 国产va在线| 亚洲人成网站在线播放2019| 欧美日本一区二区三区免费| 亚洲一区波多野结衣二区三区| 青青青视频91在线 | 91国语视频| 亚洲经典在线中文字幕| 久久久久人妻一区精品色奶水| 国产一区二区三区免费观看| 色呦呦手机在线精品| 国产网站免费| 成人精品在线观看| 免费a在线观看播放| 香蕉伊思人视频| 亚洲日本在线免费观看| 日韩a级毛片| 国产在线自在拍91精品黑人| 精品国产女同疯狂摩擦2| 永久在线精品免费视频观看| 中国成人在线视频| 97国产在线播放| 亚洲男人天堂网址| 欧美日韩精品一区二区在线线| 四虎综合网| 乱码国产乱码精品精在线播放| 亚洲午夜天堂| 好久久免费视频高清| 波多野结衣视频网站| 亚洲v日韩v欧美在线观看| a色毛片免费视频| 欧洲在线免费视频| 激情爆乳一区二区| 国产在线精品人成导航| 久久黄色视频影| 蜜桃视频一区二区三区| 黄色网站在线观看无码| 91外围女在线观看| 亚洲激情99| 婷婷色在线视频| 国产福利不卡视频| 国产美女丝袜高潮| 国产精品任我爽爆在线播放6080| 波多野结衣在线一区二区| 99热最新在线| 国产精品99r8在线观看| 国产H片无码不卡在线视频| 国产高清毛片| 91九色视频网| 亚洲妓女综合网995久久| 老色鬼欧美精品| 97久久免费视频| 一级香蕉视频在线观看| 久久伊人操| 制服无码网站| 热这里只有精品国产热门精品| 直接黄91麻豆网站| 中文字幕 日韩 欧美| 毛片手机在线看| 欧美全免费aaaaaa特黄在线| 欧美亚洲综合免费精品高清在线观看| 综合社区亚洲熟妇p| 成人免费黄色小视频| 免费一级毛片不卡在线播放| 一本色道久久88亚洲综合| 视频一本大道香蕉久在线播放|