C++對象內存佈局--虛基類表的使用

http://www.cnblogs.com/cswuyg/archive/2010/08/20/1804111.html         還有很多相關的內存佈局相關文章


C++對象內存佈局--虛基類表的使用

一、測試VS編譯器,虛基類表在函數調用時是怎麼使用的

1、測試代碼:

//虛基類表指針的使用.cpp
//2010.8.19
//使用VC++6.0/VS2005/VS2008編譯器編譯,OllyDbg反彙編工具調試查看虛基類表的使用。
#include <iostream>
using namespace std;
////////////////////////////////////////////////////////////////
class Base
{
    public:
        Base(int a = 10):a(a)
        {
        }
        virtual void show()
        {
            cout << "Base::show()" << endl;
        }
        virtual void testA()
        {
            cout << "Base::testA()" << endl;
        }
    private:
        int a;
};
////////////////////////////////////////////////////////////////
class BaseA : virtual public Base
{
    public:
        BaseA(int b = 20):b(b)
        {
        }
        virtual void showA()
        {
            cout << "BaseA::showA()" << endl;
        }
        void testA()
        {
            cout << "BaseA::testA()" << endl;
        }
    private:
        int b;
};
////////////////////////////////////////////////////////////////
class BaseB : virtual public Base
{
    public:
        BaseB(int c = 30):c(c)
        {
        }
        virtual void showB()
        {
            cout << "BaseB::showB()" << endl;
        }
    private:
        int c;
};
////////////////////////////////////////////////////////////////
class Derived : public BaseA, public BaseB
{
    public:
        Derived(int d = 40):d(d)
        {
        }
        virtual void show()
        {
            cout << "Derived::show()" << endl;
        }
        virtual void test()
        {
            cout << "Derived::test()" << endl;
        }
    private:
        int d;
};
////////////////////////////////////////////////////////////////
int main()
{
    Derived obj;
    cout << "start" << endl;//爲方便反彙編調試設置的標記
    Base *pb = &obj;
    pb->show();
    cout << "start" << endl;//爲方便反彙編調試設置的標記、
    system("pause");
    return 0;
}

2、使用OllyDbg反彙編調試的相關結果:

 

圖 1 VC++6.0編譯器,OD調試結果

 

圖 2 VS2005/2008編譯器,OD調試結果

3、結果表明,在調用虛基類函數的時候,有使用到虛基類表指針。

二、測試GCC編譯器,虛基類表在函數調用時是怎麼使用的

1、測試代碼跟上邊的一樣。

2、使用OllyDbg反彙編調試的相關結果:

  

圖 3 GCC編譯器,OD調試結果

3、結果表明,在調用虛基類函數的時候,沒用到虛基類表指針,直接:ADD EAX, 14,獲取虛基類實例地址。可能是測試的代碼比較簡單,編譯器做了優化。

0
0
(請您對文章做出評價)
« 上一篇:C++對象內存佈局--⑩GCC編譯器--虛擬繼承--菱形繼承
» 下一篇:C++對象內存佈局測試總結

發佈了11 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章