虚函数表在内存中的位置
  以前虽然考虑过这个问题,但是试了下以后就以为虚函数表在内存的代码区⾥,后来还被问到虚函数表在内存中的哪⾥,回答不同编译器对虚函数的处理是不⼀样的,今天仔细的测了测。
  当然以下的测试是在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;
return0;
}
观察其中⼀个虚函数的指针指向的位置:
注意下⾯那个字符串,如果你没有看到字符串的话⼀定不知道这是在内存的哪个区,看到字符串就知道,这是在内存的常量区,也就是虚函数被放在这⾥,被放在这⾥也还是⽐较容易理解的,因为,虚函数表是不需要改变的,放在常量区是⽐较保险的做法。
后再在⽹查了查,知道虚函数表vtable在Linux/Unix中存放在可执⾏⽂件的只读数据段中(rodata)。
总结:虚函数表由于⼀旦产⽣就具有不变性,所以编译器就会经量把它放到稳定(或者说是只读)的内存区。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。