分享
 
 
 

C++对象的放置

王朝c/c++·作者佚名  2008-06-01
窄屏简体版  字體: |||超大  

(声明:本文参考了《深度探索c++对象模型》这本书,我连例子都和此书一样,

如有人认为是偷的话,还请各位原谅,^_^)

经历过从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

从上面的输出结果来看,对象是如何布局的就一幕了然了,假如你不信,可以自己可

以试试看,输出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++类究竟是如何放置的(我不认为我是在转牛角尖).

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有