zoukankan      html  css  js  c++  java
  • C++对象内存布局虚基类表的使用

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

  • 相关阅读:
    朴素贝叶斯分类-实战篇-如何进行文本分类
    朴素贝叶斯分类-理论篇-如何通过概率解决分类问题
    数据变换-归一化与标准化
    你还不懂傅里叶变换,那就过来掐死我吧
    Python快速入门 ---- 系列文章
    批处理中的时间计算详解
    使用electron+vue开发一个跨平台todolist(便签)桌面应用
    文科妹子都会用 GitHub,你这个工科生还等什么
    如约而至,.NET 5.0 正式发布
    如何进行正确的沟通?
  • 原文地址:https://www.cnblogs.com/cswuyg/p/1804111.html
Copyright © 2011-2022 走看看