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

理解C++中臨時對象的來源

2012-04-29 00:44:03郝亞洲李文敏
環(huán)球市場信息導報 2012年7期

郝亞洲 李文敏

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

C++;臨時變量;臨時對象

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

[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++對象模型[M].武漢:華中科技大學出版社,2007.05

主站蜘蛛池模板: 国产亚洲视频免费播放| 日本国产精品一区久久久| 中文字幕无线码一区| 99久久精品国产精品亚洲| 在线看片免费人成视久网下载| 国产精品成人久久| 国产乱子伦视频三区| 国模沟沟一区二区三区| 97视频在线观看免费视频| 欧美人人干| 97se综合| 久久综合成人| 亚洲第一香蕉视频| 国产一区三区二区中文在线| 中文字幕在线看视频一区二区三区| 国产在线视频二区| 免费一级α片在线观看| 久久黄色影院| 亚洲天堂视频在线免费观看| 午夜小视频在线| 福利在线免费视频| 国产情侣一区二区三区| 免费在线色| 久久熟女AV| www.精品国产| 奇米影视狠狠精品7777| 国产国拍精品视频免费看| 青青操国产| 9966国产精品视频| 国产微拍精品| 一级爱做片免费观看久久| 永久免费av网站可以直接看的| 伊人福利视频| 成人精品区| h视频在线播放| 国产女人水多毛片18| 这里只有精品在线播放| 欧美一级夜夜爽| 91免费观看视频| 久久99精品久久久大学生| 欧美视频二区| 欧美伊人色综合久久天天| 欧美人人干| 国产网友愉拍精品| a毛片基地免费大全| 午夜毛片免费观看视频 | 国产精品女主播| 日本福利视频网站| 日本人妻丰满熟妇区| av在线手机播放| 日本久久网站| 亚洲精品高清视频| 中文字幕日韩欧美| 四虎AV麻豆| 老司机久久99久久精品播放| 精品欧美日韩国产日漫一区不卡| 国产综合精品日本亚洲777| 在线观看免费黄色网址| 99久久99视频| 奇米影视狠狠精品7777| 亚洲精品国产综合99| 日韩人妻少妇一区二区| 亚洲日韩欧美在线观看| 无码AV日韩一二三区| 亚洲精品国产成人7777| 日韩欧美色综合| 国产亚洲精品91| 亚洲妓女综合网995久久| 欧美一级夜夜爽www| 久久亚洲AⅤ无码精品午夜麻豆| 精品久久久久久中文字幕女| 亚洲人免费视频| 国产精品亚欧美一区二区| 色天天综合久久久久综合片| 国产手机在线小视频免费观看| 国产美女免费| 国产精品成人一区二区| 伊人色天堂| 亚洲第一视频区| 日韩毛片视频| 亚洲中文字幕久久精品无码一区| 国产视频入口|