C++对象内存布局--虚基类表的使用

来源:互联网 发布:百度淘宝秒杀插件 编辑:程序博客网 时间:2024/05/08 20:04

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,获取虚基类实例地址。可能是测试的代码比较简单,编译器做了优化。

分类: C++对象内存布局
绿色通道: 好文要顶 关注我 收藏该文与我联系 
烛秋
关注 - 10
粉丝 - 35
+加关注
0
0
(请您对文章做出评价)
« 上一篇:C++对象内存布局--⑩GCC编译器--虚拟继承--菱形继承
» 下一篇:C++对象内存布局测试总结

0 0
原创粉丝点击