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

大龍的博客

常用鏈接

統計

最新評論

掀起你的蓋頭來——談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 大龍 閱讀(314) 評論(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资源网站| 18成人免费观看视频| 亚洲精品视频在线播放| 国产人成精品一区二区三| 久久这里只有| 欧美日韩一区二区精品| 欧美在线啊v一区| 老司机免费视频久久| 亚洲图片欧美一区| 亚久久调教视频| 亚洲日本久久| 亚洲在线第一页| 亚洲人成人99网站| 亚洲一级片在线观看| 亚洲国产成人在线视频| 亚洲一级特黄| 亚洲精品123区| 亚洲综合色自拍一区| 亚洲欧洲精品一区| 亚洲欧美日韩另类精品一区二区三区| 欧美精品日韩综合在线| 久久国产精品久久精品国产 | 一本色道久久综合亚洲91| 亚洲视频欧洲视频| 亚洲电影观看| 亚洲自拍偷拍色片视频| 亚洲巨乳在线| 久久视频在线看| 久久er99精品| 欧美性猛交一区二区三区精品| 免费亚洲电影在线观看| 国产欧美一区二区精品秋霞影院| 亚洲电影免费| 在线观看日韩www视频免费 | 亚洲黄色av| 黄色精品一区二区| 午夜亚洲性色视频| 亚洲伊人伊色伊影伊综合网| 欧美电影在线| 欧美电影在线观看| 一区在线免费| 欧美中文日韩| 久久国产精品久久久| 欧美日韩第一区| 亚洲国产日韩一区| 亚洲高清在线精品| 久久久综合网站| 美国十次成人| 激情欧美丁香| 久久久久久亚洲综合影院红桃| 欧美一区二区三区久久精品茉莉花| 欧美视频在线不卡| 亚洲免费激情| 亚洲影院高清在线| 国产精品欧美久久久久无广告| 亚洲人体1000| 亚洲天堂视频在线观看| 欧美日韩国产影院| 日韩视频在线一区二区| 亚洲——在线| 国产精品任我爽爆在线播放| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 亚洲精品日韩久久| 在线视频亚洲| 国产精品九九| 亚洲欧美中日韩| 久热国产精品| 亚洲日本成人| 欧美日韩国产一区| 亚洲天堂免费观看| 久久成人免费日本黄色| 狠狠色狠狠色综合人人| 麻豆精品在线观看| 日韩视频一区二区三区在线播放免费观看 | 亚洲精品精选| 亚洲在线观看免费| 国产一区二区三区电影在线观看| 欧美怡红院视频一区二区三区| 麻豆精品在线播放| 一区二区三区免费看| 国产乱人伦精品一区二区| 久久九九全国免费精品观看| 欧美激情偷拍| 亚洲欧美精品在线观看| 一区二区在线视频| 欧美日韩国产三级| 久久成人精品无人区| 亚洲国产高潮在线观看| 亚洲欧美激情四射在线日| 国内精品久久久久久| 欧美精品久久久久久| 性xx色xx综合久久久xx| 亚洲国产99| 欧美中文字幕在线观看| 日韩亚洲不卡在线| 狠狠色噜噜狠狠狠狠色吗综合| 欧美韩国日本一区| 欧美呦呦网站| 亚洲精品国产精品国产自| 久久精品二区三区| 一本久久精品一区二区| 在线观看久久av| 国产精品拍天天在线| 欧美二区视频| 久久久久免费观看| 亚洲在线视频观看| 亚洲免费大片| 欧美成人乱码一区二区三区| 午夜视频精品| 一区二区三区精品视频在线观看| 在线观看91精品国产入口| 国产精品成人v| 欧美激情第五页| 久久综合九色欧美综合狠狠| 亚洲欧美制服中文字幕| 一区二区成人精品| 亚洲欧洲精品成人久久奇米网| 久热国产精品| 久久青青草综合| 欧美中文字幕在线视频| 亚洲欧美第一页| 亚洲在线视频网站| 在线亚洲一区观看| 夜夜嗨av一区二区三区中文字幕 | 欧美日韩另类综合| 欧美激情综合网| 免费看的黄色欧美网站| 久久久九九九九| 久久福利电影| 久久精品国产2020观看福利| 先锋亚洲精品| 欧美一区二区观看视频| 午夜日韩电影| 久久精品一区二区国产| 欧美一区激情| 久久免费国产| 麻豆精品一区二区av白丝在线| 美女久久一区| 裸体一区二区| 欧美精品免费在线观看| 欧美日韩国产成人在线91| 欧美日本一区二区三区| 欧美金8天国| 欧美色欧美亚洲另类七区| 欧美午夜不卡| 国产一区二区三区在线播放免费观看| 国产区欧美区日韩区| 精品电影在线观看| 91久久在线| 亚洲小少妇裸体bbw| 亚洲永久免费精品| 久久se精品一区二区| 久久深夜福利| 亚洲国产精品一区二区三区| 日韩亚洲欧美中文三级| 亚洲一区二区三区精品在线| 久久爱www.| 欧美理论电影网| 国产欧美日韩视频在线观看| 韩日成人在线| 日韩性生活视频| 欧美在线亚洲一区| 欧美h视频在线| 亚洲手机在线| 两个人的视频www国产精品| 欧美片在线观看| 韩国亚洲精品| 亚洲一区二区三| 久久综合伊人77777尤物| 亚洲精品1区| 欧美专区一区二区三区| 欧美日韩国产色视频| 国内激情久久| 亚洲女同精品视频| 欧美成人蜜桃| 午夜精品视频网站| 欧美绝品在线观看成人午夜影视| 国产精品亚洲一区| 日韩网站在线| 久久综合五月| 亚洲免费在线播放| 欧美高清视频www夜色资源网| 国产精品自拍小视频| 一区二区福利| 欧美成人日韩| 久久精品国产精品| 国产精品系列在线| 一区二区日韩欧美| 欧美高清视频一区二区|