C++工具的安排
副标题#e#
经验过从c到c++的人,必然想知道c++编译器是如何布置类的成员的.这里我或许的作一下先容,并有一些代码供你举办测试,但愿对各人有点浸染吧.
其实这里的标题或者有点大了,简朴的说,类的非static成员是凭据声明的顺序存放在内存区的,而类的static成员和一般的static变量的存储名目一样.我不从简朴的对象入手了,直接从一个相对巨大的多重担任的例子入手.看下面的代码:
class Point2d
{
public:
int _x,_y;
virtual f(){}//担保Point2d有个虚拟指针
};
class Point3d:public Point2d
{
public:
int _z;
};
class Vertex
{
public:
virtual void h(){}//担保Vertex3d的第二基本类有个vptr
int next;
};
class Vertex3d:public Point3d,public Vertex
{
public:
int mumble;
};
Point2d,Point3d,Vertex,Vertex3d的担任干系能看得出来吧.再看主函数
int main()
{
Vertex3d v3d;
Vertex*pv;
pv=&v3d;
int*x=&v3d._x;//获取v3d的成员的地点
int*y=&v3d._y;
int*z=&v3d._z;
int*n=&v3d.next;
int*mem=&v3d.mumble;
cout<<"*v3d= "<<&v3d<<endl;//输出第一个vptr
cout<<"*x= "<<x<<endl;//输出成员的x的地点
cout<<"*y= "<<y<<endl;//….
cout<<"*z= "<<z<<endl;//…..
cout<<"*pv= "<<pv<<endl;/.输出第二个vptr
cout<<"*n= "<<n<<endl;//…….
cout<<"*mem= "<<mem<<endl;//……..
return 0;
}
我在vc6.0编译运行的功效是:
&v3d = 0x0012ff64
x = 0x0012ff68
y = 0x0012ff6c
z = 0x0012ff70
pv = 0x0012ff74
n = 0x0012ff78
mem = 0x0012ff7c
#p#副标题#e#
从上面的输出功效来看,工具是如何机关的就一幕了然了,假如你不信,可以本身可以试试看,输出Vertex3d的尺寸瞧一瞧,^_^.留意,Vertex3d内有两个vptr,假如还不知道为什么会有的话,发起你先去看看书吧!!
增补:我想到另一个较量直观的要领,就是操作Placement Operator New(PON)的要领,相对应的尚有Placement Operator Delete.至于这些观念,我就不多说了,^_^. 适才看到那些地点都是内存中的,但可以操作(PON)把那些地点放倒一个数组中
去,那样会更直观,不信,你看着:
#include<iostream.h>
#include<new.h>
class Point2d
{
public:
int _x,_y;//
Point2d(){
_x=10;
_y=20;
}
virtual f(){}
};
class Point3d:public Point2d
{
public:
int _z;
Point3d(){_z=30;}
};
class Vertex
{
public:
int next;
Vertex(){next=40;}
virtual void f(){}
virtual void g(){}
virtual void h(){}
};
class Vertex3d:public Point3d,public Vertex
{
public:
int mumble;
Vertex3d(){mumble=50;}
};
int main()
{
long str[30];
Vertex3d*array=new(str)Vertex3d;
for(int i=0;i<sizeof(Vertex3d)/4;i++)
{
cout<<str[i]<<endl;
}
//这里需要显示挪用Vertex3d的析构函数,
return 0;
}
让我逐步说来,这里的一些类,只是添加告终构函数罢了,为的是可以或许直观.我界说了一个数组为的安排Vertex3d工具,范例为long是由于上面的类的每个成员都是四个字节,而虚拟指针(vptr)也是四个字节,这样输出很利便.
Vertex3d*array=new(str)Vertex3d;这条语句就是用了PON要领,在数组str中安排
一个Vertex3d工具,一切都已经做好了,工具的机关就是在数组str中,不妨去看看str中的内容,这里我就不规划把输出功效写出来了,本身调试.有个缺陷就是看不到virtual函数的函数地点(固然有其他的要领,但不直观.vc调试模式下直接就可以看, 或者我会想到步伐的)
就简朴说这么些了,vc编译器的debug模式下可以直接看到的,更直观,但我的
目标只是弄懂c++类毕竟是如何安排的(我不认为我是在转牛角尖).