下載本文檔
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、c+標(biāo)準(zhǔn)編程:虛函數(shù)與內(nèi)聯(lián)曾經(jīng)在研究c+的時(shí)候,常常會(huì)問(wèn)到:“虛函數(shù)能被聲明為內(nèi)聯(lián)嗎?”現(xiàn)在,我們幾乎聽(tīng)不到這個(gè)問(wèn)題了。現(xiàn)在聽(tīng)到的是:“你不應(yīng)當(dāng)使print成為內(nèi)聯(lián)的。聲明一個(gè)虛函數(shù)為內(nèi)聯(lián)是錯(cuò)誤的!”這種說(shuō)法的兩個(gè)主要的緣由是(1)虛函數(shù)是在運(yùn)行期決議而內(nèi)聯(lián)是一個(gè)編譯期動(dòng)作,所以,我們將虛函數(shù)聲明為內(nèi)聯(lián)并得不到什么效果;(2)聲明一個(gè)虛函數(shù)為內(nèi)聯(lián)導(dǎo)致了函數(shù)的多分拷貝,而且我們?yōu)橐粋€(gè)不應(yīng)當(dāng)在任何時(shí)候內(nèi)聯(lián)的函數(shù)白白花費(fèi)了存儲(chǔ)空間。這樣做很沒(méi)腦子。不過(guò),事實(shí)并不是這樣。我們先來(lái)看看第一個(gè):許多狀況下,虛擬函數(shù)都被靜態(tài)地決議了比如在派生類(lèi)虛擬函數(shù)中調(diào)用基類(lèi)的虛擬函數(shù)的時(shí)候。為什么這樣做呢?封裝。一個(gè)比
2、較顯然的例子就是派生類(lèi)析構(gòu)函數(shù)調(diào)用鏈。全部的虛析構(gòu)函數(shù),除了最初觸發(fā)這個(gè)析構(gòu)鏈的虛析構(gòu)函數(shù),都被靜態(tài)的決議了。假如不將基類(lèi)的虛析構(gòu)函數(shù)內(nèi)聯(lián),我們無(wú)法從中獲利a。這和不內(nèi)聯(lián)一個(gè)虛擬析構(gòu)函數(shù)有什么不同嗎?假如繼承體系層次比較深并且有許多這樣的類(lèi)的實(shí)例要被銷(xiāo)毀的話,答案是絕對(duì)的。再來(lái)看另外一個(gè)不用析構(gòu)函數(shù)的例子,想象一下設(shè)計(jì)一個(gè)圖書(shū)館類(lèi)。我們將materiallocation作為抽象類(lèi)librarymaterial的一個(gè)成員。將它的print成員函數(shù)聲明為一個(gè)純虛函數(shù),并且提供函數(shù)定義:它輸出materiallocation。class librarymaterial private:materia
3、llocation _loc; / shared data/ .public:/ declares pure virtual functioninline virtual void print( ostream& = cout ) = 0;/ we actually want to encapsulate the handling of the/ location of the material within a base class/ librarymaterial print() method - we just dont want it/ invoked through the
4、virtual interface. that is, it is/ only to be invoked within a derived class print() methodinline voidlibrarymaterial:print( ostream &os ) os print();這個(gè)print實(shí)例是內(nèi)聯(lián)的嗎?不,固然不是。這樣不得不通過(guò)虛擬機(jī)制在運(yùn)行期決議。這讓print實(shí)例放棄了對(duì)它的內(nèi)聯(lián)聲明白嗎?也不是。這個(gè)調(diào)用轉(zhuǎn)換為下面的形式(偽代碼):/ pseudo code/ possible transformation of p->print()( *p-&g
5、t;_vptr 2 )( p );where 2 represents the location of print within the associated virtual function table.由于調(diào)用print是通過(guò)函數(shù)指針_vptr2舉行的,所以,編譯器不能靜態(tài)的打算這個(gè)調(diào)用地址,并且,這個(gè)函數(shù)也不能內(nèi)聯(lián)。固然,虛函數(shù)print的內(nèi)聯(lián)實(shí)體(definition)也必需在某個(gè)地方表現(xiàn)出來(lái)。 即是說(shuō),起碼有一個(gè)函數(shù)實(shí)體是在virtual table調(diào)用的地址原地綻開(kāi)的。編譯器是如何打算在何時(shí)綻開(kāi)這個(gè)函數(shù)實(shí)體呢?其中一個(gè)編譯(implementaion)策略是當(dāng)virtual tab
6、le生成的同時(shí),生成這個(gè)函數(shù)實(shí)體。這就是說(shuō)對(duì)于每一個(gè)派生類(lèi)的virtual table都會(huì)生成一個(gè)函數(shù)實(shí)體。在一個(gè)可應(yīng)用的類(lèi)中有多少vitrual table會(huì)被生成呢?呵呵,這是一個(gè)好問(wèn)題。c+標(biāo)準(zhǔn)中對(duì)虛函數(shù)行為舉行了規(guī)定,但是沒(méi)有對(duì)函數(shù)實(shí)現(xiàn)舉行規(guī)定。因?yàn)関irtual table沒(méi)有在c+標(biāo)準(zhǔn)中舉行規(guī)定,很顯然,畢竟這個(gè)virtual table怎樣生成,和畢竟要生成多少個(gè)vitrual table也沒(méi)有規(guī)定。多少個(gè)?固然,我們只要一個(gè)。stroustrup的cfront編譯器,很巧妙的處理了這些狀況.( stan and andy koenig described the algorit
7、hm in the march 1990 c+ report article, "optimizing virtual tables in c+ release 2.0.")moreover, the c+ standard now requires that inline functions behave as though only one definition for an inline function exists in the program even though the function may be defined in different files。新
8、的規(guī)章要求編譯器只綻開(kāi)一個(gè)內(nèi)聯(lián)虛函數(shù)。假如一點(diǎn)被廣泛采納的話,虛函數(shù)的內(nèi)聯(lián)導(dǎo)致的代碼膨脹問(wèn)題就會(huì)消逝。譯注:c+ standard: 9.3.8, member function of local class shall be defined inline in their class defination, if they are defined at all=譯注:a函數(shù)調(diào)用開(kāi)銷(xiāo),調(diào)用基類(lèi)虛函數(shù)的時(shí)候起碼要經(jīng)過(guò)兩次間接過(guò)程(s. b.lippman: inside the c+ object model)一個(gè)產(chǎn)品類(lèi)(?)總結(jié):就是虛函數(shù)inline在調(diào)用鏈等地方很實(shí)用即使沒(méi)有加入inline聲明,作為一個(gè)好編譯器,都會(huì)優(yōu)化(虛析構(gòu)函數(shù))在很長(zhǎng)的函數(shù)調(diào)用鏈中,最好將鏈中基類(lèi)的函數(shù)inline
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年土地使用權(quán)轉(zhuǎn)讓合同(含開(kāi)發(fā)權(quán))
- 2024年廣西路分公司一級(jí)干線租用合同
- 2024年安全監(jiān)控外包服務(wù)合同
- 2024年工程設(shè)計(jì)變更合同補(bǔ)充
- 2024年度石油化工設(shè)備安裝調(diào)試合同
- 2024年工廠租賃合同書(shū)
- 2024年度塔吊設(shè)計(jì)研發(fā)合同
- 2024購(gòu)房合同應(yīng)注意事項(xiàng)
- 2024征地補(bǔ)償安置合同范本
- 2024年學(xué)校治安門(mén)衛(wèi)合同
- 電泳-厚-度-檢-測(cè)-記錄
- 服務(wù)采購(gòu)詢(xún)比價(jià)表
- 衛(wèi)生院會(huì)議制度
- 小學(xué) 四年級(jí) 體育水平二 基本運(yùn)動(dòng)技能平衡篇 課件
- 巧克力簡(jiǎn)介課件
- 初中語(yǔ)文人教七年級(jí)上冊(cè)要拿我當(dāng)一挺機(jī)關(guān)槍使用
- 北京頌歌原版五線譜鋼琴譜正譜樂(lè)譜
- PSUR模板僅供參考
- 火力發(fā)電企業(yè)作業(yè)活動(dòng)風(fēng)險(xiǎn)分級(jí)管控清單(參考)
- 民法典合同編之保證合同實(shí)務(wù)解讀PPT
- 全國(guó)第四輪學(xué)科評(píng)估PPT幻燈片課件(PPT 24頁(yè))
評(píng)論
0/150
提交評(píng)論