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

  • 相关阅读:
    LeetCode 295. Find Median from Data Stream (堆)
    LeetCode 292. Nim Game(博弈论)
    《JavaScript 模式》读书笔记(4)— 函数2
    《JavaScript 模式》读书笔记(4)— 函数1
    《JavaScript 模式》读书笔记(3)— 字面量和构造函数3
    《JavaScript 模式》读书笔记(3)— 字面量和构造函数2
    《JavaScript 模式》读书笔记(3)— 字面量和构造函数1
    《JavaScript 模式》读书笔记(2)— 基本技巧3
    《JavaScript 模式》读书笔记(2)— 基本技巧2
    《JavaScript 模式》读书笔记(2)— 基本技巧1
  • 原文地址:https://www.cnblogs.com/cswuyg/p/1804111.html
Copyright © 2011-2022 走看看