• <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>

            大龍的博客

            常用鏈接

            統計

            最新評論

            掀起你的蓋頭來——談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 大龍 閱讀(301) 評論(0)  編輯 收藏 引用

            久久不见久久见免费影院www日本| 91精品国产综合久久精品| 久久天天躁狠狠躁夜夜avapp| 久久AⅤ人妻少妇嫩草影院| 久久精品草草草| 亚洲国产另类久久久精品| 精品久久久久久无码人妻热| 88久久精品无码一区二区毛片| 91精品国产91久久久久久| 99国内精品久久久久久久| 精品99久久aaa一级毛片| 久久久艹| 亚洲香蕉网久久综合影视| 久久精品国产久精国产思思| 久久国产精品成人免费 | 四虎影视久久久免费观看| 色99久久久久高潮综合影院 | 久久伊人精品青青草原高清| 大蕉久久伊人中文字幕| 亚洲精品WWW久久久久久| 国产成人精品久久| 国产精品岛国久久久久| 久久青草国产手机看片福利盒子| 久久99精品久久久久久野外| 亚洲国产成人久久综合野外| 欧美牲交A欧牲交aⅴ久久| 久久久久无码专区亚洲av| 一本久久a久久精品亚洲| 国产一区二区三区久久精品| 人妻中文久久久久| 久久亚洲精品无码aⅴ大香| 99久久精品国产麻豆| 久久精品国产精品亚洲人人| 久久精品国产精品亚洲毛片| 亚洲国产香蕉人人爽成AV片久久| 久久亚洲精品中文字幕| 久久这里只有精品视频99| 俺来也俺去啦久久综合网| 久久久国产亚洲精品| 久久WWW免费人成—看片| 久久夜色精品国产噜噜亚洲AV|