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

牽著老婆滿街逛

嚴(yán)以律己,寬以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

C++類對應(yīng)的內(nèi)存結(jié)構(gòu)

轉(zhuǎn)載自:http://blog.csdn.net/guogangj/archive/2008/01/11/2036785.aspx



提示1:對“內(nèi)存結(jié)構(gòu)”表示有疑問或不解的,先參考:

http://blog.csdn.net/guogangj/archive/2007/05/25/1625199.aspx

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

 

提示2:下文提到的“類大小”嚴(yán)格上來說是該類經(jīng)過實(shí)例化的對象的大小。當(dāng)然了,光研究長度的話,兩者差別不大,因?yàn)?span style="LINE-HEIGHT: 24px" lang=EN-US>:CClassA objAsizeof(CClassA)sizeof(objA)得到的結(jié)果都是一樣的。

 

一、真空類

class CNull

{

};

長度:1

內(nèi)存結(jié)構(gòu):

??

評注:長度其實(shí)為0,這個字節(jié)作為內(nèi)容沒有意義,可能每次都不一樣。

 

二、空類

class CNull2

{

public:

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

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

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

};

長度:1

內(nèi)存結(jié)構(gòu):

??

評注:同真空類差不多,內(nèi)部的成員函數(shù)并不會影響類大小。

 

三、簡單類

class COneMember

{

public:

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

private:

    int m_iOne;

};

長度:4

內(nèi)存結(jié)構(gòu):

00 00 00 00 //m_iOne

評注:成員數(shù)據(jù)才影響類大小。

 

四、簡單繼承

class CTwoMember:public COneMember

{

private:

    int m_iTwo;

};

長度:8

內(nèi)存結(jié)構(gòu):

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

內(nèi)存結(jié)構(gòu):

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

內(nèi)存結(jié)構(gòu):

01 00 00 00  //A

02 00 00 00  //B

03 00 00 00  //C

04 00 00 00  //Complex

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

 

七、復(fù)雜一些的繼承

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

長度:32

內(nèi)存結(jié)構(gòu):

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),我想沒什么難點(diǎn),不巧的是“虛”正是我們要研究的內(nèi)容。

 

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

class CTwoMember:virtual public COneMember

{

private:

    int m_iTwo;

};

長度:12

內(nèi)存結(jié)構(gòu):

E8 2F 42 00 //指針,指向一個關(guān)于偏移量的數(shù)組,且稱之虛基類偏移量表指針

CC CC CC CC // m_iTwo

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

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

 

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

長度:24

內(nèi)存結(jié)構(gòu):

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

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

 

十、看一下關(guān)于static成員

class CStaticNull

{

public:

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

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

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

    static int m_iValue;

};

長度:1

內(nèi)存結(jié)構(gòu):(同CNull2

評注:可見static成員不會占用類的大小,static成員的存在區(qū)域?yàn)殪o態(tài)區(qū),可認(rèn)為它們是“全局”的,只是不提供全局的訪問而已,這跟Cstatic其實(shí)沒什么區(qū)別。

 

十一、帶一個虛函數(shù)的空類

class CVirtualNull

{

public:

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

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

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

};

長度:4

內(nèi)存結(jié)構(gòu):

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

 

00423100:(虛表)

41 10 40 00 //指向虛函數(shù)Foo的指針

 

00401041:

E9 78 02 00 00 E9 C3 03  //函數(shù)Foo的內(nèi)容(看不懂)

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

 

十二、繼承帶虛函數(shù)的類

class CVirtualDerived : public CVirtualNull

{

public:

    CVirtualDerived(){m_iVD=0xFF;};

    ~CVirtualDerived(){};

private:

    int m_iVD;

};

長度:8

內(nèi)存結(jié)構(gòu):

3C 50 42 00 //虛表指針

FF 00 00 00 //m_iVD

 

0042503C:(虛表)

23 10 40 00 //指向虛函數(shù)Foo的指針,如果這時候創(chuàng)建一個CVirtualNull對象,會發(fā)現(xiàn)它的虛表的內(nèi)容跟這個一樣

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

 

十三、子類有新的虛函數(shù)

class CVirtualDerived: public CVirtualNull

{

public:

    CVirtualDerived(){m_iVD=0xFF;};

    ~CVirtualDerived(){};

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

private:

    int m_iVD;

};

長度:8

內(nèi)存結(jié)構(gòu):

24 61 42 00 //虛表指針

FF 00 00 00 //m_iVD

 

00426124:(虛表)

23 10 40 00

50 10 40 00

評注:虛表還是只有一張,不會因?yàn)樵黾恿诵碌奶摵瘮?shù)而多出另一張來,新的虛函數(shù)的指針將添加在復(fù)制了的虛表的后面。

 

十四、當(dāng)純虛函數(shù)(pure function)出現(xiàn)時

class CPureVirtual

{

    virtual void Foo() = 0;

};

 

class CDerivePV : public CPureVirtual

{

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

};

長度:4CPureVirtual),4CDerivePV

內(nèi)存結(jié)構(gòu):

CPureVirtual:

(不可實(shí)例化)

 

CDerivePV:

28 50 42 00 //虛表指針

 

00425028:(虛表)

5A 10 40 00 //指向Foo的函數(shù)指針

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

 

十五、虛函數(shù)類的多重繼承

前面提到:(子類的虛表)不會因?yàn)樵黾恿诵碌奶摵瘮?shù)而多出另一張來,但如果有多重繼承的話情況就不是這樣了。下例中你將看到兩張?zhí)摫怼?span style="LINE-HEIGHT: 24px" lang=EN-US>

大小:24

內(nèi)存結(jié)構(gòu)

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

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

 

本來還想看看更復(fù)雜些的情況,甚至包括虛繼承和虛函數(shù)同時出現(xiàn)的多重多層繼承情況,但確實(shí)有些復(fù)雜了,自己還有些找不到規(guī)律,所以準(zhǔn)備之后再補(bǔ)充。


posted on 2010-03-18 14:34 楊粼波 閱讀(1121) 評論(1)  編輯 收藏 引用

評論

# re: C++類對應(yīng)的內(nèi)存結(jié)構(gòu) 2010-06-13 00:34 chaogu

很有幫助,不過能在解釋一下
class A{
private:
char charMember;
short shortMember;
int intMember;
}
那就無敵了。

如果再跟struct比較一下,那頂?shù)娜硕嗔恕?br>如果順便解釋一下struct中的pading和union
那你說這篇文章是什么?  回復(fù)  更多評論   


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   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| 在线观看一区二区精品视频| 免费日韩av| 国产欧美日韩综合精品二区| 亚洲精品日韩激情在线电影| 亚洲激情av在线| 久久久999精品视频| 久久精品论坛| 国产模特精品视频久久久久 | 欧美亚洲视频在线观看| 亚洲一二三区精品| 欧美片第一页| 亚洲美女黄网| 亚洲少妇中出一区| 欧美视频中文一区二区三区在线观看 | 最新亚洲视频| 亚洲国产天堂久久综合网| 久久精品午夜| 美女爽到呻吟久久久久| 1769国产精品| 欧美成人免费大片| 亚洲精品极品| 亚洲婷婷综合久久一本伊一区| 欧美日本在线视频| 99亚洲伊人久久精品影院红桃| 国产精品99久久久久久人| 欧美日韩精品免费看| 一区二区三区高清在线观看| 亚洲欧美日韩成人| 国产日韩精品入口| 久久米奇亚洲| 亚洲高清av在线| 亚洲调教视频在线观看| 国产伦精品一区二区三区高清| 午夜免费日韩视频| 欧美成人第一页| 在线亚洲欧美视频| 国产精品一区一区| 国产精品久久久久久久久婷婷 | 国产女主播视频一区二区| 午夜宅男欧美| 日韩视频三区| 亚洲午夜久久久久久久久电影院| 91久久精品国产91性色| 久久精品国产一区二区电影| 欧美一级视频免费在线观看| 欧美伦理91i| 亚洲国产综合在线| 亚洲国产精品一区| 久久久久久久久久久一区| 欧美伊人精品成人久久综合97 | 久久精品国产91精品亚洲| 午夜欧美大尺度福利影院在线看| 欧美日一区二区三区在线观看国产免 | 精品不卡一区| 欧美综合激情网| 久久精品一区四区| 国产中文一区二区| 欧美中文日韩| 麻豆精品精品国产自在97香蕉| 国产一区二区成人| 久久精品女人的天堂av| 可以看av的网站久久看| 伊人久久成人| 裸体丰满少妇做受久久99精品 | 性高湖久久久久久久久| 国产精品亚洲网站| 性久久久久久久久久久久| 久久爱另类一区二区小说| 国产女主播一区二区| 性亚洲最疯狂xxxx高清| 久久女同精品一区二区| 亚洲福利在线观看| 欧美高清在线视频| 日韩视频在线一区二区三区| 亚洲影院色无极综合| 国产精品专区第二| 久久乐国产精品| 亚洲欧洲综合另类在线| 亚洲一区二区精品在线| 国产亚洲欧美aaaa| 另类亚洲自拍| 一区二区三区鲁丝不卡| 久久久五月天| 日韩亚洲欧美成人| 国产精品香蕉在线观看| 久久在线免费观看| 99热免费精品| 久久综合狠狠| 亚洲美女色禁图| 国产日韩欧美成人| 欧美+亚洲+精品+三区| 亚洲午夜精品视频| 男人的天堂亚洲| 亚洲女人天堂av| 亚洲国产精品www| 国产精品久久午夜| 免费观看亚洲视频大全| 亚洲资源在线观看| 亚洲国产第一| 久久久久久久国产| 欧美精品一区二区三区高清aⅴ| 午夜久久影院| 亚洲在线一区二区| 国产精品亚洲人在线观看| 欧美一区二区三区免费观看视频 | 欧美黑人多人双交| 亚洲四色影视在线观看| 国内一区二区在线视频观看| 欧美人妖在线观看| 久久天天躁狠狠躁夜夜av| 正在播放亚洲一区| 亚洲国产精品一区二区www在线 | 亚洲专区免费| 亚洲日韩视频| 激情综合色丁香一区二区| 国产精品久久久久久久电影 | 久久久久看片| 亚洲欧美日韩视频一区| 日韩午夜免费| 91久久国产综合久久蜜月精品 | 亚洲综合99| 日韩亚洲欧美高清| 亚洲国产成人av在线| 国产一区二区三区四区在线观看| 欧美日韩在线精品一区二区三区| 美女久久一区| 久久精品国产一区二区三区免费看| 亚洲网站在线观看| 99精品国产在热久久| 91久久精品国产| 欧美激情精品久久久久久黑人 | 免费短视频成人日韩| 久久精品一区二区| 欧美在线播放高清精品| 欧美亚洲免费| 午夜在线一区| 欧美在线你懂的| 欧美呦呦网站| 久久精品国产v日韩v亚洲 | 麻豆精品视频在线观看| 久久久久欧美精品| 久久亚洲精品视频| 美女性感视频久久久| 鲁大师成人一区二区三区| 免费成年人欧美视频| 欧美国产极速在线| 亚洲成色777777在线观看影院| 欧美激情亚洲激情| 亚洲激情影院| 亚洲图中文字幕| 午夜精品久久一牛影视| 久久国产精品一区二区三区四区| 久久精品视频va| 欧美成人午夜激情| 欧美特黄一级| 国产一区 二区 三区一级| 在线播放日韩| 一本大道久久精品懂色aⅴ | 在线成人激情黄色| 亚洲精品美女| 亚洲欧美国产不卡| 老司机精品视频网站| 99视频热这里只有精品免费| 亚洲一区综合| 麻豆精品91| 99天天综合性| 久久国产精品亚洲va麻豆| 欧美精品v日韩精品v韩国精品v| 欧美另类videos死尸| 国产精品视频导航| 亚洲黄色三级| 亚洲欧美另类国产| 欧美a级在线| 亚洲一区成人| 欧美va亚洲va日韩∨a综合色| 国产精品扒开腿做爽爽爽视频 | 午夜精品亚洲| 欧美国产精品一区| 亚洲淫片在线视频| 嫩草国产精品入口| 国产亚洲福利| 一区二区日韩免费看| 久久综合久久综合久久综合| 日韩一级片网址| 久久综合九色九九| 国产精品免费福利| 日韩午夜在线电影| 久久在线91| 亚洲在线免费观看| 欧美日韩成人网| 亚洲国产欧美不卡在线观看| 香蕉av777xxx色综合一区| 亚洲精品久久久蜜桃| 久久综合五月| 国产午夜精品一区二区三区欧美| 一区二区日韩精品| 亚洲国产欧美不卡在线观看| 久久精品国产久精国产爱 | 久久精品夜色噜噜亚洲a∨|