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

C++分析研究  
C++
日歷
<2013年3月>
242526272812
3456789
10111213141516
17181920212223
24252627282930
31123456
統(tǒng)計
  • 隨筆 - 92
  • 文章 - 4
  • 評論 - 4
  • 引用 - 0

導(dǎo)航

常用鏈接

留言簿

隨筆檔案

文章檔案

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

 
  我們曾經(jīng)在討論C++的時候,經(jīng)常會問到:“虛函數(shù)能被聲明為內(nèi)聯(lián)嗎?”現(xiàn)在,我們幾乎聽不到這個問題了。現(xiàn)在聽到的是:“你不應(yīng)該使print成為內(nèi)聯(lián)的。聲明一個虛函數(shù)為內(nèi)聯(lián)是錯誤的!”

  這種說法的兩個主要的原因是(1)虛函數(shù)是在運行期決議而內(nèi)聯(lián)是一個編譯期動作,所以,我們將虛函數(shù)聲明為內(nèi)聯(lián)并得不到什么效果;(2)聲明一個虛函數(shù)為內(nèi)聯(lián)導(dǎo)致了函數(shù)的多分拷貝,而且我們?yōu)橐粋€不應(yīng)該在任何時候內(nèi)聯(lián)的函數(shù)白白花費了存儲空間。這樣做很沒腦子。 www.601456.com

  不過,事實并不是這樣。我們先來看看第一個:許多情況下,虛擬函數(shù)都被靜態(tài)地決議了——比如在派生類虛擬函數(shù)中調(diào)用基類的虛擬函數(shù)的時候。為什么這樣做呢?封裝。一個比較明顯的例子就是派生類析構(gòu)函數(shù)調(diào)用鏈。所有的虛析構(gòu)函數(shù),除了最初觸發(fā)這個析構(gòu)鏈的虛析構(gòu)函數(shù),都被靜態(tài)的決議了。如果不將基類的虛析構(gòu)函數(shù)內(nèi)聯(lián),我們無法從中獲利[a]。這和不內(nèi)聯(lián)一個虛擬析構(gòu)函數(shù)有什么不同嗎?如果繼承體系層次比較深并且有許多這樣的類的實例要被銷毀的話,答案是肯定的。

  再來看另外一個不用析構(gòu)函數(shù)的例子,想象一下設(shè)計一個圖書館類。我們將MaterialLocation作為抽象類LibraryMaterial的一個成員。將它的print成員函數(shù)聲明為一個純虛函數(shù),并且提供函數(shù)定義:它輸出MaterialLocation。

  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ù)輸出Title, Author等等。在這之前,它調(diào)用基類的print函數(shù)(LibraryMaterial::print())來顯示書本位置(MaterialLocation)。如下:

  inline void

  Book:: www.liuhebao.com

  print( ostream &os )

  {

  // ok, this is resolved statically,

  // and therefore is inline expanded ...

  LibraryMaterial::print();

  os <<"title:" <<_title

  << "author" <<_author < www.szfuao.com

  AudioBook類,派生于Book類,并加入附加信息,比如旁述,音頻格式等等。這些東西都用它的print函數(shù)輸出。再這之前,我們需要調(diào)用Book::print()來顯示前面的信息。

  inline void

  AudioBook::

  print( ostream &os )

  {

  // ok, this is resolved statically,

  // and therefore is inline expanded ...

  Book::print(); www.yzjxsp.com

  os <<"narrator:" <<_narrator <

  }

  這和虛析構(gòu)函數(shù)調(diào)用鏈的例子一樣,都只是最初調(diào)用的虛函數(shù)沒有被靜態(tài)決議,其它的都被原地展開。This unnamed hierarchical design pattern is significantly less effective if we never declare a virtual function to be inline.

  那么對于第二個原因中代碼膨脹的問題呢?我們來分析一下,如果我們寫下:

  LibraryMaterial *p =

  new AudioBook( "Mason &Dixon",

  "Thomas Pynchon", "Johnny Depp" );

  // ...

  p->print();

  這個print實例是內(nèi)聯(lián)的嗎?不,當(dāng)然不是。這樣不得不通過虛擬機制在運行期決議。這讓print實例放棄了對它的內(nèi)聯(lián)聲明了嗎?也不是。這個調(diào)用轉(zhuǎn)換為下面的形式(偽代碼):

  // Pseudo C++Code www.yzsws.com

  // Possible transformation of p->print()

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

  where 2 represents the location of print within the associated virtual function table.因為調(diào)用print是通過函數(shù)指針_vptr[2]進行的,所以,編譯器不能靜態(tài)的決定這個調(diào)用地址,并且,這個函數(shù)也不能內(nèi)聯(lián)。

  當(dāng)然,虛函數(shù)print的內(nèi)聯(lián)實體(definition)也必須在某個地方表現(xiàn)出來。 即是說,至少有一個函數(shù)實體是在virtual table調(diào)用的地址原地展開的。編譯器是如何決定在何時展開這個函數(shù)實體呢?其中一個編譯(implementaion)策略是當(dāng)virtual table生成的同時,生成這個函數(shù)實體。這就是說對于每一個派生類的virtual table都會生成一個函數(shù)實體。

  在一個可應(yīng)用的類[b]中有多少vitrual table會被生成呢?呵呵,這是一個好問題。C++標(biāo)準(zhǔn)中對虛函數(shù)行為進行了規(guī)定,但是沒有對函數(shù)實現(xiàn)進行規(guī)定。由于virtual table沒有在C++標(biāo)準(zhǔn)中進行規(guī)定,很明顯,究竟這個virtual table怎樣生成,和究竟要生成多少個vitrual table也沒有規(guī)定。多少個?當(dāng)然,我們只要一個。Stroustrup的cfront編譯器,很巧妙的處理了這些情況.( Stan and Andy Koenig described the algorithm 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。新的規(guī)則要求編譯器只展開一個內(nèi)聯(lián)虛函數(shù)。如果一點被廣泛采用的話,虛函數(shù)的內(nèi)聯(lián)導(dǎo)致的代碼膨脹問題就會消失。 www.yzyedu.com

  [譯注: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)用開銷,調(diào)用基類虛函數(shù)的時候至少要經(jīng)過兩次間接過程(S. B.Lippman: 《Inside the C++ Object Model》)

  [b]一個產(chǎn)品類(?)

  總結(jié):

  就是虛函數(shù)inline在調(diào)用鏈等地方很有用~

  即使沒有加入inline聲明,作為一個好編譯器,都會優(yōu)化(虛析構(gòu)函數(shù))

  在很長的函數(shù)調(diào)用鏈中,最好將鏈中基類的函數(shù)inline,這樣節(jié)約開銷

  至于在什么地方inline,由編譯器決定,因為C++標(biāo)準(zhǔn)沒有規(guī)定

  新C++標(biāo)準(zhǔn)(可能沒有通過)中,規(guī)定了,inline化只對產(chǎn)品類有效,且只動作一次

  保證代碼不過度膨脹

  inline動作是在產(chǎn)品類實例化同時,和vtable生成一起
posted on 2011-02-20 23:41 HAOSOLA 閱讀(199) 評論(0)  編輯 收藏 引用

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


 
Copyright © HAOSOLA Powered by: 博客園 模板提供:滬江博客
PK10開獎 PK10開獎
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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热软件| 久久理论片午夜琪琪电影网| 亚洲一区三区在线观看| 一区二区三区国产在线| 99v久久综合狠狠综合久久| 欧美韩日高清| 亚洲欧洲一区二区三区在线观看| 久久国产精品99国产| 久久精品1区| 久久午夜影视| 欧美激情偷拍| 一区二区久久久久久| 欧美国产日本在线| 亚洲人成网站999久久久综合| 亚洲理伦在线| 欧美亚洲尤物久久| 免费日韩av| 国产精品福利网站| 一色屋精品亚洲香蕉网站| 亚洲精品一线二线三线无人区| 久久噜噜亚洲综合| 欧美大片一区二区三区| 国产精品爱久久久久久久| 国产一区二区三区日韩欧美| 亚洲国产福利在线| 午夜激情一区| 欧美大片一区| 亚洲欧美中文日韩v在线观看| 久久综合久久88| 国产精品高清在线观看| 在线观看视频一区二区欧美日韩| 在线视频欧美精品| 免费观看不卡av| 亚洲性感美女99在线| 欧美成年人网站| 国产日韩精品入口| 夜夜嗨av一区二区三区四季av | 国产亚洲欧洲一区高清在线观看| 136国产福利精品导航网址| 亚洲一品av免费观看| 欧美成人自拍| 性18欧美另类| 国产精品久久久久影院色老大| 亚洲国产欧美精品| 久久夜色精品国产亚洲aⅴ| 亚洲深夜av| 欧美日韩综合网| 99精品久久久| 亚洲国产精品综合| 久久综合综合久久综合| 国产一级精品aaaaa看| 亚洲欧美国产精品桃花| 亚洲精品欧美在线| 欧美激情一区二区三区全黄| 在线成人免费观看| 久久久久久9999| 午夜精品免费视频| 国产精品资源| 欧美在线视频一区二区三区| 亚洲深夜av| 国产精品国产三级国产专播品爱网| 亚洲精品乱码视频| 亚洲国产成人久久综合一区| 久久综合伊人77777麻豆| 尤物99国产成人精品视频| 久久久国产精品亚洲一区| 欧美在线地址| 国内精品久久久久久久影视麻豆| 欧美在线播放一区二区| 亚洲欧美在线视频观看| 国产伦精品一区二区三区免费| 亚洲免费在线观看视频| 亚洲一区欧美一区| 国产情人综合久久777777| 久久精品人人做人人综合| 欧美中文在线观看国产| 樱花yy私人影院亚洲| 亚洲精品一区在线| 久久久久久久综合| 欧美影院在线播放| 在线观看视频免费一区二区三区 | 国产精品九色蝌蚪自拍| 亚洲午夜久久久久久久久电影网| 夜夜嗨av一区二区三区免费区| 国产精品扒开腿爽爽爽视频| 欧美亚洲日本国产| 久久精品国产亚洲一区二区| 亚洲国产成人av好男人在线观看| 亚洲国产视频直播| 欧美午夜在线视频| 久久久久久综合网天天| 欧美成年人视频网站| 亚洲网站视频福利| 欧美亚洲免费电影| 亚洲肉体裸体xxxx137| 亚洲视频国产视频| 亚洲电影免费| 亚洲无吗在线| 亚洲国产精品女人久久久| 亚洲麻豆国产自偷在线| 国产欧美日韩在线播放| 亚洲国产精品成人va在线观看| 欧美午夜剧场| 欧美激情一区二区三区全黄 | 欧美一级久久久| 欧美激情亚洲视频| 久久久久久久久久久久久9999| 欧美精品电影| 欧美成人黑人xx视频免费观看| 国产精品高潮呻吟久久av无限| 美女久久网站| 国产婷婷一区二区| 亚洲私人影院在线观看| 99国产精品自拍| 欧美成人在线网站| 欧美xxxx在线观看| 国产一区视频观看| 亚洲一区中文| 亚洲影院色在线观看免费| 欧美国产一区二区在线观看| 蜜臀av一级做a爰片久久| 国产女人18毛片水18精品| 夜色激情一区二区| 99视频热这里只有精品免费| 久久躁日日躁aaaaxxxx| 久久精品国产99国产精品澳门| 欧美日韩成人在线播放| 欧美激情一区三区| 久久激情综合| 性欧美精品高清| 亚洲午夜精品网| 亚洲免费伊人电影在线观看av| 久久精品女人的天堂av| 午夜精品久久久久久久99水蜜桃 | 久久久精品五月天| 亚洲成色777777女色窝| 亚洲麻豆视频| 欧美激情一区二区三区全黄| 国产精品午夜在线观看| 亚洲国产另类久久久精品极度| 国产日韩在线视频| 欧美在线视频在线播放完整版免费观看| 日韩亚洲在线观看| 另类国产ts人妖高潮视频| 午夜宅男欧美| 欧美日韩黄视频| 亚洲午夜在线观看| 亚洲视频导航| 欧美久久在线| 亚洲福利免费| 亚洲欧洲一区| 欧美日韩在线观看一区二区三区 | 欧美日韩成人| 亚洲第一精品在线| 伊人男人综合视频网| 免费日韩av片| 亚洲精品123区| 99av国产精品欲麻豆| 免费人成网站在线观看欧美高清| 久久久久国产一区二区三区| 亚洲高清自拍| 欧美ed2k| 亚洲精品国产无天堂网2021| 亚洲美女尤物影院| 久久综合精品一区| 日韩亚洲国产欧美| 亚洲专区一区| 国产香蕉久久精品综合网| 欧美一级在线视频| 国内外成人免费激情在线视频网站| 欧美一二区视频| 免费成人在线观看视频| 亚洲黄页视频免费观看| 久久久久免费观看| 亚洲人成网站777色婷婷| 亚洲精品一区久久久久久| 欧美精品三级| 亚洲尤物精选| 亚洲三级免费| 久久aⅴ国产欧美74aaa| 黄色国产精品一区二区三区| 老司机午夜免费精品视频| 亚洲一区二区三区三| 久久久亚洲欧洲日产国码αv | 亚洲国产精品电影| 夜夜夜久久久| 国产欧美日韩精品a在线观看| 99视频精品全国免费| 男人天堂欧美日韩| 中日韩高清电影网| 国内偷自视频区视频综合| 欧美成人精品福利| 久久久久青草大香线综合精品| 亚洲精品123区| 久久女同精品一区二区| 亚洲人体大胆视频| 亚洲第一福利在线观看| 国产精品久久久久久久久久直播| 久久精品欧美日韩精品|