手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

C 对象的放置

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
(声明:本文参考了《深度探索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 类究竟是如何放置的(我不认为我是在转牛角尖).




文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS