对象的内存空间布局

 

1. 没有虚拟函数的情况

1)在没有虚拟函数的情况下。对象的内存布局比较简单,就是按成员变量的定义顺序来安排成员变量在对象内存中的位置

2)成员函数的地址并不在对象的内存空间的,它和其它类外的函数一样,编译器会安排它们到某个内存空间。同样,使用一些“手段”你也可以获取成员函数的地址。

class A{   int a;    double b;   void fun();};

其实成员函数被单独分开来了,写成了这种形式void fun(A this)。函数还加一个this指针,指向调用这个函数的类对象,这个指针变量就加在形参表里,所以不用每个对象都保存成员函数。

3)第一、结构或者类中的静态成员不对结构或者类的大小产生影响,因为静态变量的存储位置与结构或者类的实例地址无关。

第二、没有成员变量的结构或类的大小为1,因为必须保证结构或类的每一个实例在内存中都有唯一的地址。

 

2. 有虚拟函数的情况

 class  C{       public:  int a;    int b;       int c;

                  private:  virtual int GetValue(){ cout<<”I got it”<<endl;  }

          };

sizeof(C)的值是16。

1) 虚函数表指针分配在数据成员之前。虚函数是放在虚函数表中,编译器会产生了一个指向虚函数表的指针。虚函数表指针就在对象内存中首地址。

 

posted on 2013-06-20 23:14  在路上的探索者  阅读(200)  评论(0)    收藏  举报

导航