对象的内存空间布局
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) 虚函数表指针分配在数据成员之前。虚函数是放在虚函数表中,编译器会产生了一个指向虚函数表的指针。虚函数表指针就在对象内存中首地址。
浙公网安备 33010602011771号