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

大龍的博客

常用鏈接

統計

最新評論

掀起你的蓋頭來——談VC++對象模型(網上)

http://dev.yesky.com/136/2317136.shtml

一個C++程序員,想要進一步提升技術水平的話,應該多了解一些語言的語意細節。對于使用VC++的程序員來說,還應該了解一些VC++對于C++的詮釋。Inside the C++ Object Model雖然是一本好書,然而,書的篇幅多一些,又和具體的VC++關系小一些。因此,從篇幅和內容來看,譯者認為本文是深入理解C++對象模型比較好的一個出發點。

  這篇文章以前看到時就覺得很好,舊文重讀,感覺理解得更多一些了,于是產生了翻譯出來,與大家共享的想法。雖然文章不長,但時間有限,又若干次在翻譯時打盹睡著,拖拖拉拉用了小一個月。

  一方面因本人水平所限,另一方面因翻譯時經常打盹,錯誤之處恐怕不少,歡迎大家批評指正。

  前言

  了解你所使用的編程語言究竟是如何實現的,對于C++程序員可能特別有意義。首先,它可以去除我們對于所使用語言的神秘感,使我們不至于對于編譯器干的活感到完全不可思議;尤其重要的是,它使我們在Debug和使用語言高級特性的時候,有更多的把握。當需要提高代碼效率的時候,這些知識也能夠很好地幫助我們。

  本文著重回答這樣一些問題:

  * 類如何布局?

  * 成員變量如何訪問?

  * 成員函數如何訪問?

  * 所謂的“調整塊”(adjuster thunk)是怎么回事?

  * 使用如下機制時,開銷如何:

  * 單繼承、多重繼承、虛繼承

  * 虛函數調用

  * 強制轉換到基類,或者強制轉換到虛基類

  * 異常處理

  首先,我們順次考察C兼容的結構(struct)的布局,單繼承,多重繼承,以及虛繼承;接著,我們講成員變量和成員函數的訪問,當然,這里面包含虛函數的情況;再接下來,我們考察構造函數,析構函數,以及特殊的賦值操作符成員函數是如何工作的,數組是如何動態構造和銷毀的;最后,簡單地介紹對異常處理的支持。

  對每個語言特性,我們將簡要介紹該特性背后的動機,該特性自身的語意(當然,本文決不是“C++入門”,大家對此要有充分認識),以及該特性在微軟的VC++中是如何實現的。這里要注意區分抽象的C++語言語意與其特定實現。微軟之外的其他C++廠商可能提供一個完全不同的實現,我們偶爾也會將VC++的實現與其他實現進行比較。

  類布局

  本節討論不同的繼承方式造成的不同內存布局。

  1、C結構(struct)

  由于C++基于C,所以C++也“基本上”兼容C。特別地,C++規范在“結構”上使用了和C相同的,簡單的內存布局原則:成員變量按其被聲明的順序排列,按具體實現所規定的對齊原則在內存地址上對齊。所有的C/C++廠商都保證他們的C/C++編譯器對于有效的C結構采用完全相同的布局。這里,A是一個簡單的C結構,其成員布局和對齊方式都一目了然。



struct A {
?? char c;
?? int i;
};

  譯者注:從上圖可見,A在內存中占有8個字節,按照聲明成員的順序,前4個字節包含一個字符(實際占用1個字節,3個字節空著,補對齊),后4個字節包含一個整數。A的指針就指向字符開始字節處。

  2、有C++特征的C結構

  當然了,C++不是復雜的C,C++本質上是面向對象的語言:包含繼承、封裝,以及多態。原始的C結構經過改造,成了面向對象世界的基石——類。除了成員變量外,C++類還可以封裝成員函數和其他東西。然而,有趣的是,除非為了實現虛函數和虛繼承引入的隱藏成員變量外,C++類實例的大小完全取決于一個類及其基類的成員變量!成員函數基本上不影響類實例的大小。

  這里提供的B是一個C結構,然而,該結構有一些C++特征:控制成員可見性的“public/protected/private”關鍵字、成員函數、靜態成員,以及嵌套的類型聲明。雖然看著琳瑯滿目,實際上只有成員變量才占用類實例的空間。要注意的是,C++標準委員會不限制由“public/protected/private”關鍵字分開的各段在實現時的先后順序,因此,不同的編譯器實現的內存布局可能并不相同。(在VC++中,成員變量總是按照聲明時的順序排列)。



struct B {
public:
?? int bm1;
protected:
?? int bm2;
private:
?? int bm3;
?? static int bsm;
?? void bf();
?? static void bsf();
?? typedef void* bpv;
?? struct N { };
};

  譯者注:B中,為何static int bsm不占用內存空間?因為它是靜態成員,該數據存放在程序的數據段中,不在類實例中。

  3、單繼承

  C++提供繼承的目的是在不同的類型之間提取共性。比如,科學家對物種進行分類,從而有種、屬、綱等說法。有了這種層次結構,我們才可能將某些具備特定性質的東西歸入到最合適的分類層次上,如“懷孩子的是哺乳動物”。由于這些屬性可以被子類繼承,所以,我們只要知道“鯨魚、人”是哺乳動物,就可以方便地指出“鯨魚、人都可以懷孩子”。那些特例,如鴨嘴獸(生蛋的哺乳動物),則要求我們對缺省的屬性或行為進行覆蓋。

  C++中的繼承語法很簡單,在子類后加上“:base”就可以了。下面的D繼承自基類C。



struct C {
?? int c1;
?? void cf();
};



struct D : C {
?? int d1;
?? void df();
};

  既然派生類要保留基類的所有屬性和行為,自然地,每個派生類的實例都包含了一份完整的基類實例數據。在D中,并不是說基類C的數據一定要放在D的數據之前,只不過這樣放的話,能夠保證D中的C對象地址,恰好是D對象地址的第一個字節。這種安排之下,有了派生類D的指針,要獲得基類C的指針,就不必要計算偏移量了。幾乎所有知名的C++廠商都采用這種內存安排。在單繼承類層次下,每一個新的派生類都簡單地把自己的成員變量添加到基類的成員變量之后。看看上圖,C對象指針和D對象指針指向同一地址。

posted on 2007-01-05 10:22 大龍 閱讀(310) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   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>
            国产精品久久婷婷六月丁香| 亚洲欧美激情视频| 久久国产精品电影| 亚洲大片av| 亚洲天堂成人在线视频| 在线精品观看| 亚洲电影免费观看高清完整版在线| 欧美激情一区在线| 另类国产ts人妖高潮视频| 亚洲欧美在线视频观看| 在线中文字幕一区| 99国产精品久久久久久久久久| 亚洲第一狼人社区| 欧美激情免费观看| 欧美婷婷久久| 国产日韩欧美不卡| 国产午夜亚洲精品不卡| 狠狠色丁香婷综合久久| 国产在线不卡精品| 一区精品久久| 999亚洲国产精| 亚洲免费在线精品一区| 久久经典综合| 欧美电影在线观看完整版| 亚洲国产你懂的| 欧美肥婆bbw| 欧美激情亚洲精品| 亚洲女爱视频在线| 暖暖成人免费视频| 国产拍揄自揄精品视频麻豆| 亚洲日本无吗高清不卡| 午夜欧美大片免费观看| 亚洲电影在线看| 欧美一级理论性理论a| 欧美日韩的一区二区| 在线免费不卡视频| 久久久久国产精品人| 夜夜爽www精品| 欧美日韩亚洲成人| 日韩视频永久免费观看| 欧美91精品| 久久精品免费电影| 国产一区二区三区在线观看精品 | 蜜桃精品久久久久久久免费影院| 一本久久知道综合久久| 欧美日韩国产免费观看| 亚洲精品国产精品国自产观看浪潮 | 在线日韩电影| 免费成人高清| 欧美成人亚洲| 亚洲欧美成人在线| 亚洲午夜一级| 国产亚洲福利| 鲁鲁狠狠狠7777一区二区| 久久性色av| 中文亚洲欧美| 亚洲尤物视频网| 亚洲国产精品欧美一二99| 最新高清无码专区| 国产精品久久久久久亚洲调教 | 尤物精品在线| 亚洲电影免费观看高清完整版在线 | 午夜精品一区二区三区在线播放| 国模私拍一区二区三区| 欧美91福利在线观看| 欧美日韩精品是欧美日韩精品| 亚洲一线二线三线久久久| 欧美一区二区视频网站| 一区二区三区久久| 久久久久高清| 久久精品午夜| 国产精品日本一区二区| 亚洲精品视频一区二区三区| 在线观看国产日韩| 欧美伊人影院| 欧美视频中文在线看 | 亚洲亚洲精品在线观看| 久久综合色一综合色88| 久久九九国产| 国产日韩在线一区| 亚洲欧美日韩天堂一区二区| 亚洲午夜视频在线| 欧美婷婷在线| 亚洲婷婷在线| 久久九九国产精品| 玖玖视频精品| 91久久精品国产91久久性色| 麻豆成人av| 亚洲靠逼com| 久久国产精品久久国产精品| 国内精品久久久久影院薰衣草| 久久久久一区二区三区| 亚洲国产一区二区三区青草影视| 亚洲人成7777| 国产视频一区二区三区在线观看| 午夜精品婷婷| 91久久精品国产91久久| 亚洲欧美美女| 伊人久久综合| 欧美日韩中文在线观看| 香蕉久久一区二区不卡无毒影院| 欧美成人精品高清在线播放| 中文网丁香综合网| 在线精品视频一区二区| 欧美日韩免费一区二区三区视频 | 免费观看国产成人| 亚洲欧洲综合| 国产精品私拍pans大尺度在线| 欧美护士18xxxxhd| 亚洲精品女av网站| 亚洲激情另类| 亚洲欧美日韩人成在线播放| 亚洲精品之草原avav久久| 亚洲黄色在线| 性欧美8khd高清极品| 亚洲国产日韩综合一区| 久久野战av| 久久久久久91香蕉国产| 欧美中文在线视频| 午夜国产一区| 销魂美女一区二区三区视频在线| 日韩西西人体444www| 亚洲国产精品久久久久秋霞蜜臀 | 国产日韩一区二区三区在线| 欧美日韩精品福利| 国产精品久久久久久久久久三级 | 亚洲东热激情| 亚洲国产婷婷香蕉久久久久久| 国产日韩一区二区| 好吊一区二区三区| 亚洲免费观看高清完整版在线观看| 樱花yy私人影院亚洲| 亚洲精品久久久久久一区二区| 91久久极品少妇xxxxⅹ软件| 宅男噜噜噜66一区二区| 性感少妇一区| 欧美激情第8页| 一区二区三区精密机械公司 | 欧美日韩在线免费观看| 国产精品一区二区在线| 亚洲成人中文| 亚洲一二区在线| 免费91麻豆精品国产自产在线观看| 亚洲日本成人在线观看| 亚洲一区二区三区免费在线观看| 久久成人av少妇免费| 欧美日韩国产探花| 影音先锋久久| 欧美资源在线| 亚洲一区二区精品视频| 欧美精品日韩一区| 亚洲二区精品| 欧美国产精品久久| 久久久精品免费视频| 国产亚洲成av人片在线观看桃| 99精品黄色片免费大全| 亚洲第一区在线观看| 麻豆av一区二区三区| 一区在线免费观看| 麻豆精品一区二区综合av | 欧美大片免费看| 久久视频在线免费观看| 国内精品国产成人| 久久久久久自在自线| 久久成人资源| 亚洲精品乱码久久久久久蜜桃麻豆| 理论片一区二区在线| 欧美高清在线视频| 亚洲影音一区| 欧美一区二区三区久久精品茉莉花 | 亚洲三级网站| 国产精品v欧美精品∨日韩| 亚洲一区视频在线观看视频| 一区二区三欧美| 国产一区二区三区av电影| 老司机午夜精品视频| 韩国美女久久| 欧美中在线观看| 欧美国产一区二区在线观看| 亚洲深夜av| 久热精品视频| 欧美在线观看一二区| 奶水喷射视频一区| 亚洲永久免费| 免费不卡欧美自拍视频| 亚洲欧美制服中文字幕| 久久久精品日韩| 欧美制服丝袜| 国产精品福利av| 亚洲精品日韩在线| 亚洲国产免费看| 久久国产精品一区二区三区四区| 亚洲视频精选| 欧美理论在线播放| 欧美成人a视频| 黄色亚洲精品| 久久中文精品| 亚洲福利久久| 9l国产精品久久久久麻豆| 免费观看一区|