青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Legend

inline virtual function

標(biāo)準(zhǔn)C++編程:虛函數(shù)與內(nèi)聯(lián)

Josée Lajoie and Stanley Lippman

------------------------------------------------------------------------------
----

[This is the last installment of a column that was being published in C++ Repo
rt magazine. Since the magazine ceased publication before this installment cou
ld be published, Josée Lajoie and Stan Lippman were gracious enough to let us
publish it on the CUJ website. — mb]

 

曾經(jīng),我們常常在談及C++時(shí)聽到一個(gè)問題:“虛函數(shù)真的應(yīng)該被申明為內(nèi)聯(lián)嗎?”現(xiàn)在,
我們很少再聽到這個(gè)問題了。反過來,我們現(xiàn)在聽到的是“你不應(yīng)該將print()函數(shù)內(nèi)聯(lián)。
將虛函數(shù)申明為內(nèi)聯(lián)是錯(cuò)誤的。”

這么說有兩個(gè)主要理由:(1)虛函數(shù)是在運(yùn)行期判決的,而內(nèi)聯(lián)是編譯期行為,所以不能從
這個(gè)(內(nèi)聯(lián))申明上得到任何好處;(2)將虛函數(shù)申明為內(nèi)聯(lián)將造成此函數(shù)在可執(zhí)行文件中
有多份拷貝,因此我們?yōu)橐粋€(gè)無論如何都不能內(nèi)聯(lián)的函數(shù)付出了在空間上的處罰(WQ注,
所謂的內(nèi)聯(lián)函數(shù)非內(nèi)聯(lián)問題)。顯然沒腦子。

只是它并不真的正確。反思一下理由(1):在很多情況下,虛函數(shù)是靜態(tài)判決的--尤其是
派生類的虛函數(shù)調(diào)用它的基類版本時(shí)。為什么會(huì)那么做?封裝。一個(gè)很好的例子是析構(gòu)函
數(shù)的靜態(tài)調(diào)用鏈:基類的析構(gòu)函數(shù)被派生類的析構(gòu)函數(shù)觸發(fā)。除了最初的一個(gè)外,所有的
析構(gòu)函數(shù)的調(diào)用都是被靜態(tài)判決的。不讓基類的虛析構(gòu)函數(shù)內(nèi)聯(lián),就不能從中獲益。這會(huì)
造成很大的差別嗎?如果繼承層次很深,而又有大量的對(duì)象需要析構(gòu),(答案是)“是的
”。

另外一個(gè)例子不涉及析構(gòu)函數(shù)。想像我們正在設(shè)計(jì)一個(gè)圖書館出借管理程序。我們已經(jīng)將
“位置”放入抽象類LibraryMaterial。當(dāng)申明print()函數(shù)為純虛函數(shù)時(shí),我們也提供其
定義:打印出對(duì)象的位置。

class LibraryMaterial {

private:

MaterialLocation _loc; // shared data

// ...

 

public:

// declares pure virtual function

inline 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 don’t want it

// invoked through the virtual interface. That is, it is

// only to be invoked within a derived class print() method

 

inline void

LibraryMaterial::

print( ostream &os ) { os << _loc; }

 

 

接著引入Book類;它的print()函數(shù)會(huì)輸出書名、作者等等。在此之前,它先調(diào)用基類的L
ibraryMaterial::print()函數(shù)以顯示位置信息。例如:

inline void

Book::

print( ostream &os )

{

// ok, this is resolved statically,

// and therefore is inline expanded ...

LibraryMaterial::print();

 

os << "title:" << _title

<< "author" << _author << endl;

}

AudioBook類從Book派生,引入了一個(gè)二選一的借出策略,并且加入了一些附加信息,比如
講解員、格式等等。這些都將在它的print()函數(shù)中顯示出來。在顯示這些以前,它先調(diào)用
Book::print():

 

inline void

AudioBook::

print( ostream &os )

{

// ok, this is resolved statically,

// and therefore is inline expanded ...

Book::print();

os << "narrator:" << _narrator << endl;

}

在這個(gè)例子和析構(gòu)函數(shù)的例子中,派生類的虛方法遞增式地?cái)U(kuò)展其基類版本的功能,并以
調(diào)用鏈的方式被調(diào)用,只有最初一次調(diào)用是由虛體系決定的。這個(gè)沒有被命名的繼承樹設(shè)
計(jì)模式,如果從不將虛函數(shù)申明為內(nèi)聯(lián)的話,顯然會(huì)有些低效。

關(guān)于理由(2)的代碼膨脹問題怎么說?好吧,思考一下。如果寫出,

LibraryMaterial *p =

new AudioBook( "Mason & Dixon",

"Thomas Pynchon", "Johnny Depp" );

// ...

p->print();

此處的print()會(huì)內(nèi)聯(lián)嗎?不,當(dāng)然不會(huì)。這必須在運(yùn)行期經(jīng)過虛體系的判決。Okay。它會(huì)
導(dǎo)致此處的print()函數(shù)有它自己的定義體嗎?也不會(huì)。調(diào)用被編譯為類似于這種形式:


// Pseudo C++ Code

// Possible transformation of p->print()

( *p->_vptr[ 2 ] )( p );

那個(gè)2是print()函數(shù)在相應(yīng)的虛函數(shù)表中的位置。因?yàn)檫@個(gè)對(duì)print()的調(diào)用是通過函數(shù)指
針_vptr[2]進(jìn)行的,編譯器不能靜態(tài)決定被調(diào)用函數(shù)的位置,并且函數(shù)不能被內(nèi)聯(lián)。

當(dāng)然,內(nèi)聯(lián)的虛函數(shù)print()的定義必須出現(xiàn)在可執(zhí)行文件中的某處,代碼才能正確執(zhí)行。
也就是說,至少需要一個(gè)定義體,以便將它的地址放入虛函數(shù)表。編譯器如何決定何時(shí)產(chǎn)
生那一個(gè)定義體的呢?一個(gè)實(shí)現(xiàn)策略是在產(chǎn)生那類的虛函數(shù)表時(shí)同時(shí)產(chǎn)生那個(gè)定義體。這
意味著針對(duì)為一個(gè)類所生成的每個(gè)虛函數(shù)表實(shí)例,每個(gè)內(nèi)聯(lián)的虛函數(shù)的一個(gè)實(shí)例也被產(chǎn)生

在可執(zhí)行文件中,為一個(gè)類產(chǎn)生的虛函數(shù)表,實(shí)際上有多少個(gè)?啊,很好,問得好。C++標(biāo)
準(zhǔn)規(guī)定了虛函數(shù)在行為上的要求;但它沒有規(guī)定實(shí)現(xiàn)虛函數(shù)上的要求。既然虛函數(shù)表的存
在不是C++標(biāo)準(zhǔn)所要求的,明顯標(biāo)準(zhǔn)也沒有進(jìn)一步要求如何處理虛函數(shù)表以及生成多少次。
最佳的數(shù)目當(dāng)然是“一次”。例如,Stroustrup的原始cfront實(shí)現(xiàn)版本,在大部份情況下
聰明地達(dá)成了這一點(diǎn)。 (Stan和Andy Koenig描述了其算法,發(fā)表于1990年3月,C++ Repo
rt,“Optimizing Virtual Tables in C++ Release 2.0.”)

此外,C++標(biāo)準(zhǔn)現(xiàn)在要求內(nèi)聯(lián)函數(shù)的行為要滿足好象程序中只存在一個(gè)定義體,即使這個(gè)函
數(shù)可能被定義在不同的文件中。新的規(guī)則是說滿足規(guī)定的實(shí)現(xiàn)版本,行為上應(yīng)該好象只生
成了一個(gè)實(shí)例。一旦標(biāo)準(zhǔn)的這一點(diǎn)被廣泛采用,對(duì)內(nèi)聯(lián)函數(shù)潛在的代碼膨脹問題的關(guān)注應(yīng)
該消失了。

C++社群中存在著一個(gè)沖突:教學(xué)上需要規(guī)則表現(xiàn)為簡(jiǎn)單的檢查表vs實(shí)踐中需要明智地依據(jù)
環(huán)境而運(yùn)用規(guī)則。前者是對(duì)語言的復(fù)雜度的回應(yīng);后者,是對(duì)我們構(gòu)造的解決方案的復(fù)雜
度的回應(yīng)。何時(shí)將虛函數(shù)申明為內(nèi)聯(lián)的問題,是這種沖突的一個(gè)很好的例證。

 

About the Authors
Stanley Lippman was the software Technical Director for the Firebird segment o
f Disney's Fantasia 2000. He was recently technical lead on the ToonShooter im
age capture and playback system under Linux for DreamWorks Feature Animation a
nd consulted with the Jet Propulsion Laboratory. He is currently IT Training P
rogram Chair for You-niversity.com, an e-learning training company. He can be
reached at stanleyl@you-niversity, www.you-niversity.com, and www.objectwrite.
com.

Josée Lajoie is currently doing her Master's degree in Computer Graphics at t
he University Waterloo. Previously, she was a member of the C/C++ compiler dev
elopment team at the IBM Canada Laboratory and was the chair of the core langu
age working group for the ANSI/ISO C++ Standard Committee. She can be reached
at jlajoie@cgl.uwaterloo.ca.

posted on 2007-04-26 14:55 Legend 閱讀(806) 評(píng)論(0)  編輯 收藏 引用


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲欧美一区二区三区久久| 老司机午夜精品视频在线观看| 欧美日韩精品伦理作品在线免费观看 | 亚洲一区综合| 99热精品在线| 国产精品免费视频观看| 亚洲在线观看视频| 午夜精品久久久| 一区二区三区在线视频免费观看| 久久精品午夜| 美女任你摸久久| 99视频精品| 亚洲综合清纯丝袜自拍| 国产欧美在线看| 美女主播一区| 欧美裸体一区二区三区| 亚洲欧美激情诱惑| 欧美一区二区在线看| 91久久精品国产| 一区二区三区视频观看| 国产日韩1区| 久久综合影音| 欧美日韩不卡合集视频| 香蕉精品999视频一区二区| 久久精品国语| 在线视频日韩精品| 午夜在线视频一区二区区别| 亚洲国产精品黑人久久久| 日韩视频在线免费观看| 国产亚洲观看| 日韩午夜电影在线观看| 国产一区二区三区久久久久久久久| 免费人成精品欧美精品| 欧美日本中文字幕| 久久综合九色欧美综合狠狠| 欧美日韩一级黄| 久久一区二区三区四区| 欧美日韩天堂| 欧美成人一品| 国产性做久久久久久| 91久久在线观看| 国产亚洲欧美一区二区三区| 亚洲激情成人在线| 在线播放日韩| 亚洲综合色网站| 一区二区三区 在线观看视| 久久精品盗摄| 欧美与欧洲交xxxx免费观看| 欧美日韩国产一级片| 免费黄网站欧美| 国产午夜久久久久| 在线亚洲精品福利网址导航| 亚洲精品在线三区| 美女精品网站| 女同一区二区| 影音先锋久久精品| 久久久精品一区| 久久乐国产精品| 国产欧美一区二区视频| 亚洲尤物在线视频观看| 中文亚洲视频在线| 欧美日韩精品一区二区在线播放| 欧美福利一区| 亚洲黄色高清| 免费在线观看精品| 亚洲国产精品123| 亚洲国内欧美| 欧美va亚洲va日韩∨a综合色| 久久久久亚洲综合| 极品中文字幕一区| 久久久欧美一区二区| 久久综合精品国产一区二区三区| 国产亚洲高清视频| 久久精品亚洲一区二区三区浴池 | 日韩午夜剧场| 欧美精品国产| 99精品欧美一区二区三区综合在线 | 国产精品午夜av在线| 亚洲综合成人在线| 久久国产综合精品| 伊人男人综合视频网| 久久久成人网| 91久久久久久| 亚洲欧美日本日韩| 国产亚洲欧美日韩日本| 久久国产精品一区二区三区| 另类酷文…触手系列精品集v1小说| 亚洲高清在线| 欧美日韩一区自拍| 性刺激综合网| 欧美国产高潮xxxx1819| 日韩午夜电影av| 国产免费成人在线视频| 久久久在线视频| 日韩西西人体444www| 午夜日韩激情| 亚洲国产成人91精品| 欧美精品二区| 欧美一区二区在线免费播放| 亚洲大胆视频| 欧美有码视频| av成人动漫| 国产欧美一级| 欧美日本不卡高清| 欧美在线精品一区| 日韩亚洲精品电影| 老色批av在线精品| 亚洲一区二区三区四区在线观看| 国内外成人在线视频| 欧美精品国产精品日韩精品| 西西人体一区二区| 日韩视频永久免费观看| 你懂的一区二区| 欧美在线免费观看视频| 亚洲精品一区二区三区福利| 国产日韩欧美精品一区| 欧美伦理一区二区| 快播亚洲色图| 小处雏高清一区二区三区| 日韩午夜高潮| 亚洲激情二区| 欧美不卡视频一区| 久久成人一区二区| 亚洲一区二区三区视频| 亚洲精品中文字| 在线观看视频日韩| 狠狠色狠狠色综合日日tαg| 国产精品久久| 欧美日韩一区二区免费视频| 久久不射中文字幕| 午夜视频在线观看一区二区三区| 亚洲精品欧美日韩| 亚洲国产三级网| 欧美激情无毛| 老司机午夜精品视频| 久久精品中文字幕免费mv| 亚洲男人第一av网站| 亚洲视频免费在线| 一本一本a久久| 亚洲伦理精品| 一区二区欧美日韩视频| 亚洲人成人一区二区在线观看| 在线观看欧美激情| 依依成人综合视频| 在线日韩电影| 一区二区亚洲欧洲国产日韩| 国产一区二区三区无遮挡| 国产日产高清欧美一区二区三区| 国产精品久久久久高潮| 国产精品极品美女粉嫩高清在线 | 久久国产精品久久久久久久久久| 亚洲一区二区三区在线看| 亚洲图片激情小说| 亚洲在线一区二区三区| 亚洲一级在线观看| 亚洲综合国产激情另类一区| 亚洲天堂网在线观看| 亚洲专区一区| 久久精品一级爱片| 免费不卡在线视频| 欧美精品手机在线| 国产精品久久久免费| 国产三级欧美三级日产三级99| 国产三级精品三级| 亚洲国产精彩中文乱码av在线播放| 91久久精品国产91性色| 亚洲美女视频| 亚洲欧美中文日韩在线| 久久久久久久网| 亚洲大片av| 国产精品99久久久久久久久久久久| 亚洲欧美久久| 麻豆九一精品爱看视频在线观看免费| 欧美风情在线观看| 国产精品毛片在线| 在线播放日韩欧美| 亚洲网在线观看| 久久精品国产亚洲5555| 亚洲福利国产精品| 亚洲一区免费视频| 久久手机免费观看| 国产精品久久久久久影视| 黄色国产精品| 亚洲小说欧美另类社区| 久久久久国产精品一区| 亚洲三级电影全部在线观看高清| 亚洲天堂偷拍| 欧美国产日韩亚洲一区| 国产精品亚洲不卡a| 亚洲精品乱码久久久久久| 午夜视频久久久久久| 亚洲国产一区二区三区高清| 亚洲自啪免费| 欧美美女视频| 一区二区视频欧美| 欧美一区成人| 日韩亚洲精品电影| 欧美黄色视屏| 亚洲片在线资源| 免费成人黄色av|