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

本文使用的表示方法和VC6的Memory視圖一致,即:左上表示低位。

 

提示2:下文提到的“類大小”嚴格上來說是該類經過實例化的對象的大小。當然了,光研究長度的話,兩者差別不大,因為:CClassA objA,sizeof(CClassA)和sizeof(objA)得到的結果都是一樣的。

 

一、真空類

class CNull

{

};

長度:1

內存結構:

??

評注:長度其實為0,這個字節作為內容沒有意義,可能每次都不一樣。

 

二、空類

class CNull2

{

public:

    CNull2(){printf("Construct\n");}

    ~CNull2(){printf("Desctruct\n");}

    void Foo(){printf("Foo\n");}

};

長度:1

內存結構:

??

評注:同真空類差不多,內部的成員函數并不會影響類大小。

 

三、簡單類

class COneMember

{

public:

    COneMember(int iValue = 0){m_iOne = iValue;};

private:

    int m_iOne;

};

長度:4

內存結構:

00 00 00 00 //m_iOne

評注:成員數據才影響類大小。

 

四、簡單繼承

class CTwoMember:public COneMember

{

private:

    int m_iTwo;

};

長度:8

內存結構:

00 00 00 00 //m_iOne

CC CC CC CC //m_iTwo

評注:子類成員接在父類成員之后。

 

五、再繼承

class CThreemember:public CTwoMember

{

public:

    CThreemember(int iValue=10) {m_iThree = iValue;};

private:

    int m_iThree;

};

長度:12

內存結構:

00 00 00 00 //m_iOne

CC CC CC CC //m_iTwo

0A 00 00 00 //m_iThree

評注:孫類成員接在子類之后,再再繼承就依此類推了。

 

六、多重繼承

class ClassA

{

public:

    ClassA(int iValue=1){m_iA = iValue;};

private:

    int m_iA;

};

 

class ClassB

{

public:

    ClassB(int iValue=2){m_iB = iValue;};

private:

    int m_iB;

};

 

class ClassC

{

public:

    ClassC(int iValue=3){m_iC = iValue;};

private:

    int m_iC;

};

 

class CComplex :public ClassA, public ClassB, public ClassC

{

public:

    CComplex(int iValue=4){m_iComplex = iValue;};

private:

    int m_iComplex;

};


長度:16

內存結構:

01 00 00 00 //A

02 00 00 00 //B

03 00 00 00 //C

04 00 00 00 //Complex

評注:也是父類成員先出現在前邊,我想這都足夠好理解。

 

七、復雜一些的繼承

不寫代碼了,怕讀者看了眼花,改畫圖。

長度:32

內存結構:

01 00 00 00 //A

02 00 00 00 //B

03 00 00 00 //C

04 00 00 00 //Complex

00 00 00 00 //OneMember

CC CC CC CC //TwoMember

0A 00 00 00 //ThreeMember

05 00 00 00 //VeryComplex

評注:還是把自己的成員放在最后。

 

只要沒涉及到“虛”(Virtual),我想沒什么難點,不巧的是“虛”正是我們要研究的內容。

 

八、趁熱打鐵,看“虛繼承”

class CTwoMember:virtual public COneMember

{

private:

    int m_iTwo;

};

長度:12

內存結構:

E8 2F 42 00 //指針,指向一個關于偏移量的數組,且稱之虛基類偏移量表指針

CC CC CC CC // m_iTwo

00 00 00 00 // m_iOne(虛基類數據成員)

評注:virtual讓長度增加了4,其實是多了一個指針,關于這個指針,確實有些復雜,別的文章有具體分析,這里就不岔開具體講了,可認為它指向一個關于虛基類偏移量的數組,偏移量是關于虛基類數據成員的偏移量。

 

九、“閉合”虛繼承,看看效果

長度:24

內存結構:

14 30 42 00 //ClassB的虛基類偏移量表指針

02 00 00 00 //m_iB

C4 2F 42 00 //ClassC的虛基類偏移量表指針

03 00 00 00 //m_iC

04 00 00 00 //m_iComplex

01 00 00 00 //m_iA

評注:和預料中的一樣,虛基類的成員m_iA只出現了一次,而且是在最后邊。當然了,更復雜的情況要比這個難分析得多,但虛繼承不是我們研究的重點,我們只需要知道:虛繼承利用一個“虛基類偏移量表指針”來使得虛基類即使被重復繼承也只會出現一次。

 

十、看一下關于static成員

class CStaticNull

{

public:

    CStaticNull(){printf("Construct\n");}

    ~CStaticNull(){printf("Desctruct\n");}

    static void Foo(){printf("Foo\n");}

    static int m_iValue;

};

長度:1

內存結構:(同CNull2)

評注:可見static成員不會占用類的大小,static成員的存在區域為靜態區,可認為它們是“全局”的,只是不提供全局的訪問而已,這跟C的static其實沒什么區別。

 

十一、帶一個虛函數的空類

class CVirtualNull

{

public:

    CVirtualNull(){printf("Construct\n");}

    ~CVirtualNull(){printf("Desctruct\n");}

    virtual void Foo(){printf("Foo\n");}

};

長度:4

內存結構:

00 31 42 00 //指向虛函數表的指針(虛函數表后面簡稱“虛表”)

 

00423100:(虛表)

41 10 40 00 //指向虛函數Foo的指針

 

00401041:

E9 78 02 00 00 E9 C3 03 … //函數Foo的內容(看不懂)

評注:帶虛函數的類長度就增加了4,這個4其實就是個指針,指向虛函數表的指針,上面這個例子中虛表只有一個函數指針,值就是“0x00401041”,指向的這個地址就是函數的入口了。

 

十二、繼承帶虛函數的類

class CVirtualDerived : public CVirtualNull

{

public:

    CVirtualDerived(){m_iVD=0xFF;};

    ~CVirtualDerived(){};

private:

    int m_iVD;

};

長度:8

內存結構:

3C 50 42 00 //虛表指針

FF 00 00 00 //m_iVD

 

0042503C:(虛表)

23 10 40 00 //指向虛函數Foo的指針,如果這時候創建一個CVirtualNull對象,會發現它的虛表的內容跟這個一樣

評注:由于父類帶了虛函數,子類就算沒有顯式聲明虛函數,虛表還是存在的,虛表存放的位置跟父類不同,但內容是同的,也就是對父類虛表的復制。

 

十三、子類有新的虛函數

class CVirtualDerived: public CVirtualNull

{

public:

    CVirtualDerived(){m_iVD=0xFF;};

    ~CVirtualDerived(){};

    virtual void Foo2(){printf("Foo2\n");};

private:

    int m_iVD;

};

長度:8

內存結構:

24 61 42 00 //虛表指針

FF 00 00 00 //m_iVD

 

00426124:(虛表)

23 10 40 00

50 10 40 00

評注:虛表還是只有一張,不會因為增加了新的虛函數而多出另一張來,新的虛函數的指針將添加在復制了的虛表的后面。

 

十四、當純虛函數(pure function)出現時

class CPureVirtual

{

    virtual void Foo() = 0;

};

 

class CDerivePV : public CPureVirtual

{

    void Foo(){printf("vd: Foo\n");};

};

長度:4(CPureVirtual),4(CDerivePV)

內存結構:

CPureVirtual:

(不可實例化)

 

CDerivePV:

28 50 42 00 //虛表指針

 

00425028:(虛表)

5A 10 40 00 //指向Foo的函數指針

評注:帶純虛函數的類不可實例化,因此列不出其“內存結構”,由其派生類實現純虛函數。我們可以看到CDerivePV雖然沒有virtual聲明,但由于其父類帶virtual,所以還是繼承了虛表,如果CDerivePV有子類,還是這個道理。

 

十五、虛函數類的多重繼承

前面提到:(子類的虛表)不會因為增加了新的虛函數而多出另一張來,但如果有多重繼承的話情況就不是這樣了。下例中你將看到兩張虛表。

大小:24

內存結構

F8 50 42 00 //虛表指針

01 00 00 00 //m_iA

02 00 00 00 //m_iB

E8 50 42 00 //虛表指針

03 00 00 00 //m_iC

04 00 00 00 //m_iComplex

 

004250F8:(虛表)

5A 10 40 00 //FooA

55 10 40 00 //FooB

64 10 40 00 //FooComplex

 

004250E8:(虛表)

5F 10 40 00 //FooC

評注:子類的虛函數接在第一個基類的虛函數表的后面,所以B接在A后面,Complex接在B后面。基類依次出現,子類成員接在最后面,所以m_iComplex位于最后面。

Posted on 2010-06-08 16:01 鄭興鋒 閱讀(383) 評論(0)  編輯 收藏 引用
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            日韩视频在线播放| 亚洲国产精品传媒在线观看 | 欧美成人精品一区| 欧美/亚洲一区| 欧美国产视频日韩| 欧美精品导航| 国产精品捆绑调教| 国产伦一区二区三区色一情| 国产一区二区主播在线| 黄色一区二区三区四区| 在线观看视频亚洲| 亚洲午夜91| 久久久久久久网| 亚洲电影成人| 亚洲人成久久| 久久精品欧洲| 在线日韩电影| 午夜精品一区二区三区电影天堂 | 国产亚洲欧美另类中文| 国产日韩精品一区二区三区在线 | 久久久国产亚洲精品| 暖暖成人免费视频| 国产精品久久中文| 一区一区视频| 性欧美在线看片a免费观看| 亚洲精品乱码视频| 欧美成人国产| 亚洲福利电影| 久久久精品免费视频| 亚洲高清视频的网址| 亚洲天堂av图片| 欧美人妖另类| 亚洲精品韩国| 欧美日韩中文字幕日韩欧美| 黑人一区二区三区四区五区| 午夜视频一区在线观看| 在线一区二区三区四区| 欧美精品粉嫩高潮一区二区| 激情欧美亚洲| 久久综合伊人77777蜜臀| 欧美亚洲在线视频| 国产日韩高清一区二区三区在线| 91久久中文| 欧美大片免费| 欧美精品午夜| 亚洲欧美一区二区三区极速播放 | 亚洲男人av电影| 亚洲无限乱码一二三四麻| 欧美色视频一区| 久久久久久久国产| 欧美a级大片| 国产伦一区二区三区色一情| 国产亚洲人成a一在线v站| 美女久久一区| 欧美天堂亚洲电影院在线观看| 午夜免费在线观看精品视频| 欧美在线观看www| 久久久蜜桃精品| 欧美高清在线精品一区| 一区二区三区三区在线| 欧美在线3区| 亚洲自拍偷拍麻豆| 欧美激情一二三区| 欧美激情精品久久久久| 国产日韩综合一区二区性色av| 欧美高清视频在线 | 美女黄网久久| 久久综合给合久久狠狠色| 欧美日韩不卡在线| 亚洲国产另类精品专区| 黄色成人在线网站| 久久久www成人免费毛片麻豆| 一区二区欧美在线| 欧美一区二区三区在线免费观看| 亚洲免费影视第一页| 欧美午夜精品理论片a级大开眼界| 美国三级日本三级久久99| 国产麻豆9l精品三级站| 亚洲曰本av电影| 久久精品国产99国产精品| 国产一区二区三区在线观看免费视频| 亚洲欧美日韩国产中文| 久久精品中文字幕一区二区三区| 国产亚洲免费的视频看| 久久久一区二区| 亚洲日本欧美日韩高观看| 99热这里只有成人精品国产| 欧美日韩免费在线观看| 国产精品一区二区久久久| 欧美一级视频一区二区| 精品二区视频| 国产精品嫩草影院av蜜臀| 久久网站免费| 亚洲一区国产精品| 国产日韩欧美黄色| 欧美国产激情二区三区| 亚洲一区在线看| 欧美激情一级片一区二区| 亚洲欧美综合| 在线亚洲观看| 亚洲激情影院| 国产一区二区丝袜高跟鞋图片 | 麻豆精品视频在线| 午夜精品一区二区三区在线| 亚洲黄页视频免费观看| 午夜精品视频| 亚洲亚洲精品在线观看 | 久久女同互慰一区二区三区| 亚洲无限av看| 亚洲一级黄色片| 在线视频精品| 午夜精品视频在线| 午夜精品成人在线| 亚洲免费视频网站| 亚洲欧美日韩国产| 亚洲欧美韩国| 久久精品中文字幕一区二区三区 | 亚洲国产视频一区二区| 最新国产成人在线观看| 亚洲国产乱码最新视频| 亚洲成人在线网站| 欧美日韩和欧美的一区二区| 欧美大片va欧美在线播放| 久久婷婷久久| 亚洲国产精品www| 夜夜嗨av一区二区三区网站四季av| 国产欧美精品va在线观看| 国产精品久久久久毛片大屁完整版| 国产乱码精品一区二区三区av| 国产精品亚洲视频| 最新日韩在线| 欧美一区二区三区免费在线看| 亚洲欧美日韩中文在线制服| 欧美一区亚洲二区| 欧美高清在线视频| 亚洲欧美在线x视频| 欧美国产日本| 亚洲电影av| 久久亚洲精品网站| 亚洲影音一区| 欧美视频日韩| 一本一本久久| 性久久久久久久久| 在线综合欧美| 国产精品jizz在线观看美国| 亚洲精品裸体| 亚洲欧洲久久| 欧美日韩不卡在线| 亚洲午夜免费视频| 一本久久综合亚洲鲁鲁| 欧美成年人视频| 亚洲免费成人av| 日韩午夜av电影| 国产欧美在线看| 久久噜噜亚洲综合| 欧美在线www| 好看的日韩视频| 亚洲国产精品日韩| 欧美日韩国产色站一区二区三区| 亚洲另类黄色| 亚洲视频精品| 一色屋精品亚洲香蕉网站| 欧美激情一区二区三区全黄 | 亚洲欧美日韩国产综合精品二区| 亚洲精品中文字| 猛男gaygay欧美视频| 亚洲精品久久嫩草网站秘色| 亚洲激情在线视频| 一区二区三区精品久久久| 国产精品每日更新在线播放网址| 欧美亚洲系列| 欧美国产综合| 久久夜色精品一区| 欧美视频在线一区| 欧美福利一区二区| 国产精品美女久久久久久免费 | 国产一区二区丝袜高跟鞋图片 | 亚洲一区二区三区在线观看视频| 日韩午夜在线观看视频| 一区久久精品| 欧美一级久久久| 新67194成人永久网站| 欧美精品自拍| 亚洲久久在线| 一区二区三区四区五区精品视频 | 欧美激情欧美狂野欧美精品| 亚洲第一视频| 亚洲精品一区二区三区99| 在线观看欧美黄色| 久久久久国产精品一区| 另类酷文…触手系列精品集v1小说| 国产精品嫩草影院一区二区| 亚洲视频一区| 欧美伊人影院| 一区二区自拍| 欧美日韩精品二区第二页| 99re8这里有精品热视频免费 | 老巨人导航500精品| 亚洲国产一区二区在线| 男男成人高潮片免费网站|