zoukankan      html  css  js  c++  java
  • 虚函数表在内存中的位置

      以前虽然考虑过这个问题,但是试了下以后就以为虚函数表在内存的代码区里,后来还被问到虚函数表在内存中的哪里,回答不同编译器对虚函数的处理是不一样的,今天仔细的测了测。

      当然以下的测试是在win7的VS2010下。有错误欢迎批评指出,谢谢。

      测试代码

    #include <iostream>
    using namespace std;
    
    class Base1 {
    public:
        virtual void f() { cout << "Base1::f" << endl; }
        virtual void g() { cout << "Base1::g" << endl; }
        virtual void h() { cout << "Base1::h" << endl; }
    
    };
    
    class Base2 {
    public:
        virtual void f() { cout << "Base2::f" << endl; }
        virtual void g() { cout << "Base2::g" << endl; }
        virtual void h() { cout << "Base2::h" << endl; }
    };
    
    class Base3 {
    public:
        virtual void f() { cout << "Base3::f" << endl; }
        virtual void g() { cout << "Base3::g" << endl; }
        virtual void h() { cout << "Base3::h" << endl; }
    };
    
    
    class Derive : public Base1, public Base2, public Base3 {
    public:
        virtual void f() { cout << "Derive::f" << endl; }
        virtual void g1() { cout << "Derive::g1" << endl; }
    };
    
    
    typedef void(*Fun)(void);
    
    int main()
    {
        Base1* d=new Derive;
        return 0;
    }

    观察其中一个虚函数的指针指向的位置:

    注意下面那个字符串,如果你没有看到字符串的话一定不知道这是在内存的哪个区,看到字符串就知道,这是在内存的常量区,也就是虚函数被放在这里,被放在这里也还是比较容易理解的,因为,虚函数表是不需要改变的,放在常量区是比较保险的做法。

    后再在网查了查,知道虚函数表vtable在Linux/Unix中存放在可执行文件的只读数据段中(rodata)。

    总结:虚函数表由于一旦产生就具有不变性,所以编译器就会经量把它放到稳定(或者说是只读)的内存区。

  • 相关阅读:
    Java之JVM调优案例分析与实战(4)
    Qt浅谈之四十九俄罗斯方块(代码来自网络)
    自作聪明的开发
    Visual Studio 连接 SQL Server 的connectionStringz和
    删除反复行SQL举例
    一起学android之怎样设置TextView中不同字段的字体颜色(22)
    A008-drawable资源
    android 自己定义组件随着手指自己主动画圆
    一个简单的HTML5摇一摇实例
    关于事件的传递机制。
  • 原文地址:https://www.cnblogs.com/huhuuu/p/3482878.html
Copyright © 2011-2022 走看看