c++对象的放置 (转)

c++对象的放置 (转)[@more@]

  (声明:本文参考了《深度探索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<  cout<  cout<  cout<  cout<  cout<  cout<  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
#include
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  {
  cout<  }
  //这里需要显示调用Vertex3d的析构函数,
  return 0;

}
让我慢慢说来,这里的一些类,只是添加了构造函数而已,为的是能够直观.我定义
了一个数组为的放置Vertex3d对象,类型为long是由于上面的类的每个成员都是四
个字节,而虚拟指针(vptr)也是四个字节,这样输出很方便.
Vertex3d*array=new(str)Vertex3d;这条语句就是用了PON方法,在数组str中放置
一个Vertex3d对象,一切都已经做好了,对象的布局就是在数组str中,不妨去看看
str中的内容,这里我就不打算把输出结果写出来了,自己调试.有个缺陷就是看不到
virtual函数的函数地址(虽然有其他的方法,但不直观.vc调试模式下直接就可以看,或许我会想到办法的)
  就简单说这么些了,vc编译器的debug模式下可以直接看到的,更直观,但我的
目的只是弄懂c++类究竟是如何放置的(我不认为我是在转牛角尖).

 
 


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-991426/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10752043/viewspace-991426/

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值