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

C++分析研究  
C++
日歷
<2014年2月>
2627282930311
2345678
9101112131415
16171819202122
2324252627281
2345678
統計
  • 隨筆 - 92
  • 文章 - 4
  • 評論 - 4
  • 引用 - 0

導航

常用鏈接

留言簿

隨筆檔案

文章檔案

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

 
  我們曾經在討論C++的時候,經常會問到:“虛函數能被聲明為內聯嗎?”現在,我們幾乎聽不到這個問題了。現在聽到的是:“你不應該使print成為內聯的。聲明一個虛函數為內聯是錯誤的!”

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

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

  再來看另外一個不用析構函數的例子,想象一下設計一個圖書館類。我們將MaterialLocation作為抽象類LibraryMaterial的一個成員。將它的print成員函數聲明為一個純虛函數,并且提供函數定義:它輸出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函數輸出Title, Author等等。在這之前,它調用基類的print函數(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函數輸出。再這之前,我們需要調用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 <

  }

  這和虛析構函數調用鏈的例子一樣,都只是最初調用的虛函數沒有被靜態決議,其它的都被原地展開。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實例是內聯的嗎?不,當然不是。這樣不得不通過虛擬機制在運行期決議。這讓print實例放棄了對它的內聯聲明了嗎?也不是。這個調用轉換為下面的形式(偽代碼):

  // 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.因為調用print是通過函數指針_vptr[2]進行的,所以,編譯器不能靜態的決定這個調用地址,并且,這個函數也不能內聯。

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

  在一個可應用的類[b]中有多少vitrual table會被生成呢?呵呵,這是一個好問題。C++標準中對虛函數行為進行了規定,但是沒有對函數實現進行規定。由于virtual table沒有在C++標準中進行規定,很明顯,究竟這個virtual table怎樣生成,和究竟要生成多少個vitrual table也沒有規定。多少個?當然,我們只要一個。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。新的規則要求編譯器只展開一個內聯虛函數。如果一點被廣泛采用的話,虛函數的內聯導致的代碼膨脹問題就會消失。 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]函數調用開銷,調用基類虛函數的時候至少要經過兩次間接過程(S. B.Lippman: 《Inside the C++ Object Model》)

  [b]一個產品類(?)

  總結:

  就是虛函數inline在調用鏈等地方很有用~

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

  在很長的函數調用鏈中,最好將鏈中基類的函數inline,這樣節約開銷

  至于在什么地方inline,由編譯器決定,因為C++標準沒有規定

  新C++標準(可能沒有通過)中,規定了,inline化只對產品類有效,且只動作一次

  保證代碼不過度膨脹

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

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   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| 亚洲视频综合在线| 亚洲一区二区三区高清不卡| 国产精品二区三区四区| 性欧美超级视频| 午夜欧美视频| 在线观看视频欧美| 欧美黑人多人双交| 欧美黑人多人双交| 亚洲欧美日本另类| 久久精品久久99精品久久| 亚洲高清不卡| 中文欧美字幕免费| 精品999在线播放| 亚洲人成绝费网站色www| 欧美日韩精品伦理作品在线免费观看| 亚洲一区二区高清| 久久久久久一区二区| 99国产精品久久久久老师| 亚洲专区免费| 91久久国产综合久久| 亚洲午夜激情免费视频| 黄色国产精品| 9国产精品视频| 国产真实乱偷精品视频免| 欧美高清在线| 国产精品国产精品| 免费在线看一区| 国产精品v欧美精品v日韩| 久久久欧美精品| 欧美精品一线| 久久天天躁狠狠躁夜夜av| 欧美mv日韩mv国产网站app| 亚洲欧美激情视频| 欧美激情第1页| 久久久久国产成人精品亚洲午夜| 欧美激情二区三区| 久久久久亚洲综合| 国产精品成人aaaaa网站| 免费成人在线观看视频| 国产精品一区二区三区成人| 亚洲国产一区二区a毛片| 国户精品久久久久久久久久久不卡| 亚洲精品在线视频观看| 1024成人| 欧美中日韩免费视频| 性欧美大战久久久久久久免费观看| 欧美国产亚洲精品久久久8v| 久久久久久免费| 国产欧美亚洲视频| 亚洲少妇自拍| 亚洲一区二区成人在线观看| 欧美激情一区二区三区全黄| 欧美激情视频网站| 一色屋精品视频免费看| 欧美一区午夜视频在线观看| 亚洲尤物精选| 国产精品嫩草久久久久| 一本色道久久综合亚洲91| 99综合视频| 欧美日韩国产区| 亚洲精品一区二区三区不| 亚洲精品视频在线观看网站| 欧美福利小视频| 亚洲国产精品va在线看黑人| 亚洲国产日韩美| 欧美黑人国产人伦爽爽爽| 亚洲韩国日本中文字幕| 一本大道久久a久久精二百| 欧美全黄视频| 99精品国产在热久久| 亚洲综合色丁香婷婷六月图片| 欧美色图一区二区三区| 亚洲一区二区成人| 欧美在线免费看| 狠狠色综合色综合网络| 久久亚洲精品网站| 亚洲黄色性网站| 亚洲一区国产精品| 国产九九精品视频| 久久美女性网| 91久久午夜| 小黄鸭精品aⅴ导航网站入口| 国产精品亚洲一区| 久久久久久久久一区二区| 欧美大片在线影院| 亚洲手机成人高清视频| 国产九色精品成人porny| 久久九九久久九九| 91久久精品国产91久久| 亚洲永久精品大片| 国产一区二区久久精品| 老司机免费视频一区二区三区| 亚洲精品久久久久久久久久久久| 亚洲一区二区三区色| 好男人免费精品视频| 欧美激情一区二区三区全黄| 亚洲午夜免费福利视频| 你懂的国产精品| 亚洲亚洲精品在线观看| 永久91嫩草亚洲精品人人| 欧美另类69精品久久久久9999| 亚洲午夜精品视频| 老鸭窝毛片一区二区三区| 夜夜嗨av一区二区三区网页| 国产欧美va欧美va香蕉在| 欧美1区3d| 亚洲欧美日韩国产综合在线| 亚洲国产成人精品女人久久久| 亚洲欧美日产图| 亚洲国产三级网| 国产精品综合色区在线观看| 欧美肥婆在线| 久久国产视频网| 亚洲图片你懂的| 亚洲高清中文字幕| 久久久人成影片一区二区三区观看 | aa级大片欧美三级| 国内揄拍国内精品少妇国语| 欧美色道久久88综合亚洲精品| 久久久久亚洲综合| 午夜免费电影一区在线观看| 亚洲伦理精品| 亚洲电影有码| 久久久久久久999| 亚洲专区一二三| 亚洲天堂av图片| aa亚洲婷婷| 日韩天天综合| 亚洲精品日日夜夜| 亚洲国产日韩在线| 激情综合自拍| 激情综合激情| 黄色日韩精品| 国产一区二区av| 国产一区二区三区日韩欧美| 欧美系列电影免费观看| 欧美日韩国产精品自在自线| 欧美va亚洲va国产综合| 久久综合免费视频影院| 久久男人av资源网站| 久久久欧美精品sm网站| 久久九九精品| 免费的成人av| 欧美成人午夜77777| 欧美大片免费观看在线观看网站推荐| 久久天堂av综合合色| 美女国产一区| 欧美国产精品| 欧美视频中文在线看| 国产精品久久久久久久久动漫| 国产精品国产三级国产普通话99 | 亚洲欧美电影院| 午夜精品视频| 久久免费视频这里只有精品| 久久一区中文字幕| 欧美国产日本在线| 国产精品红桃| 国内精品久久久久影院色 | 国产精品久久久久久久久| 国产精品久久久久久久久久ktv | 在线观看一区二区精品视频| 在线日韩中文字幕| 日韩网站在线| 性色av一区二区三区在线观看| 久久精品国产综合精品| 欧美二区在线| 亚洲免费高清| 香蕉精品999视频一区二区| 久久久九九九九| 欧美日韩不卡合集视频| 国产精品视频久久一区| 韩日欧美一区| 亚洲手机成人高清视频| 久久久免费av| 亚洲免费电影在线| 久久精品国产免费| 欧美日韩国产区| 国产午夜精品麻豆| 99re热这里只有精品免费视频| 午夜激情综合网| 欧美第一黄色网| 西瓜成人精品人成网站| 欧美成人四级电影| 国产综合色在线| 亚洲一区二区三区三| 欧美国产一区二区| 午夜精品福利一区二区三区av| 免费视频亚洲| 国产一区日韩欧美| 一区二区三区波多野结衣在线观看| 久久精品视频在线免费观看| 99re8这里有精品热视频免费 | 国产精品一区二区女厕厕| 亚洲精品中文字幕女同|