<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    so true

    心懷未來,開創(chuàng)未來!
    隨筆 - 160, 文章 - 0, 評(píng)論 - 40, 引用 - 0
    數(shù)據(jù)加載中……

    c++內(nèi)存對(duì)象布局

    收藏陳皓的幾篇博文:
    http://haoel.blog.51cto.com/313033/124567
    http://haoel.blog.51cto.com/313033/124561
    http://haoel.blog.51cto.com/313033/124595

    看完上面的文章,應(yīng)該可以回答一個(gè)問題:指針被強(qiáng)制類型轉(zhuǎn)化之后,指針的值會(huì)改變嗎?
    答案:有時(shí)候是會(huì)的。haoel把繼承分為5類,我再把它們作個(gè)標(biāo)記:
    沒有虛繼承:?jiǎn)我焕^承(1), 非重復(fù)多重繼承(2), 重復(fù)多重繼承(3);
    有虛繼承:?jiǎn)我焕^承(4),重復(fù)多重繼承(5)。
    我先區(qū)別兩個(gè)概念“類的內(nèi)存布局(由此可以計(jì)算出類的大小)”和“類本身的內(nèi)存布局(由此可以計(jì)算出類本身的大小)”:
    sizeof(類)= sizeof(類本身) + sizeof(所有父類)。
    而類本身的內(nèi)存布局由兩部分構(gòu)成:vptr + 成員變量, 整個(gè)類的內(nèi)存布局是把類本身和所有父類的內(nèi)存布局拼接在一起的,注意:對(duì)于類型(1),整個(gè)類只有一個(gè)vptr,因此父類的內(nèi)存布局只有成員變量了。

    拼接的規(guī)則是:先父類后子類,但特例是虛擬繼承,在虛擬繼承時(shí),會(huì)變成“先子類后父類”,因?yàn)樘摂M繼承的目的是:認(rèn)為父類有common的東西,大家共享之。

    因此,vptr不一定只能出現(xiàn)在類內(nèi)存布局的始端,準(zhǔn)確的說: 應(yīng)該是出現(xiàn)在各個(gè)類本身的內(nèi)存布局的始端。
    當(dāng)發(fā)生類型轉(zhuǎn)化時(shí),比如要從Derived*轉(zhuǎn)化到Base*,轉(zhuǎn)化后的結(jié)果會(huì)是指向“Base這個(gè)父類自身的內(nèi)存布局的始端”,一旦這個(gè)始端和“Derived類的內(nèi)存布局始端“不一致,那么
    就發(fā)生了指針類型轉(zhuǎn)化后指針值的改變。
    下面是一個(gè)例子:
    #include <iostream>
    #include <string>
    #include <vector>
    #include <map>
    #include <set>

    using namespace std;

    class A {
    public:
        virtual ~A() {};
        int iA;
    };

    class A1 {
    public:
        virtual ~A1() {};
        int iA1;
    };

    class B: public A {
    public:
        virtual ~B() {};
        int iB;
    };

    class C: virtual public A {
    public:
        virtual ~C() {};
        int iC;
    };

    class D: public A, public A1 {
    public:
        virtual ~D() {};
        int iD;
    };

    int main(int argc, char* argv[]) {
        A* pa = new B();
        cout << "B size:" << sizeof(B) << endl;
        cout << "A addr:" << pa << endl;
        cout << "B addr ():" << (B*)pa << endl;
        cout << "B addr dynamic_cast:" << dynamic_cast<B*>(pa) << endl;

        cout << "-------------------------------" << endl;

        A* pa2 = new C();
        cout << "C size:" << sizeof(C) << endl;
        cout << "A addr:" << pa2 << endl;
        //cout << "C addr ():" << (C*)pa2 << endl; //compile error
        cout << "C addr dynamic_cast:" << dynamic_cast<C*>(pa2) << endl;

        cout << "-------------------------------" << endl;

        C* pc = dynamic_cast<C*>(pa2);
        cout << "C addr dynamic_cast:" << pc << endl;
        cout << "A addr ():" << (A*)pc << endl;
        cout << "A addr dynamic_cast:" << dynamic_cast<A*>(pc) << endl;

        cout << "-------------------------------" << endl;

        D* pd = new D();
        cout << "D size:" << sizeof(D) << endl;
        cout << "D addr:" << pd << endl;
        cout << "A addr ():" << (A*)pd << endl;
        cout << "A addr dynamic_cast:" << dynamic_cast<A*>(pd) << endl;
        cout << "A1 addr dynamic_cast:" << dynamic_cast<A1*>(pd) << endl;
        return 0;
    }

    結(jié)果:
    B size:16
    A addr:0x8a96010
    B addr ():0x8a96010
    B addr dynamic_cast:0x8a96010
    -------------------------------
    C size:32
    A addr:0x8a96040
    C addr dynamic_cast:0x8a96030
    -------------------------------
    C addr dynamic_cast:0x8a96030
    A addr ():0x8a96040
    A addr dynamic_cast:0x8a96040
    -------------------------------
    D size:32
    D addr:0x8a96060
    A addr ():0x8a96060
    A addr dynamic_cast:0x8a96060
    A1 addr dynamic_cast:0x8a96070

    下面還有篇對(duì)haoel的介紹,也一并收藏了:
    http://news.csdn.net/n/20070706/106194.html

    posted on 2011-04-24 12:52 so true 閱讀(1964) 評(píng)論(0)  編輯  收藏 所屬分類: C&C++

    主站蜘蛛池模板: 亚洲精品乱码久久久久久V | 亚洲国产黄在线观看| 日本不卡高清中文字幕免费| 精品亚洲成a人片在线观看 | 久久久久国色av免费看| 国产亚洲精品va在线| 黄色免费在线网站| 成人无遮挡毛片免费看| 亚洲а∨天堂久久精品| 产传媒61国产免费| 亚洲免费观看网站| 亚洲一级视频在线观看| 女人18毛片水真多免费看| 国产亚洲婷婷香蕉久久精品 | 亚洲av不卡一区二区三区| 久久成人免费大片| 亚洲成a人片在线观看老师| 日韩在线观看视频免费| 国产精一品亚洲二区在线播放 | 免费观看的毛片大全| 亚洲人成人网站色www| 日本一区午夜艳熟免费| 亚洲视频中文字幕在线| 女人张开腿给人桶免费视频| 国产亚洲综合一区二区三区| 亚洲一区爱区精品无码| 亚洲一级毛片免费在线观看| 亚洲欧美乱色情图片| 最近免费中文字幕大全免费| 亚洲第一AAAAA片| 1000部拍拍拍18勿入免费视频软件| 亚洲人成电影在线观看网| 免费大香伊蕉在人线国产| 亚洲精品永久www忘忧草| 免费涩涩在线视频网| 天堂亚洲国产中文在线| 69av免费视频| 免费夜色污私人影院网站电影| 精品国产_亚洲人成在线高清| 91在线视频免费91| 亚洲精品国产精品国自产网站|