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

时间: 2024-08-22 15:24:05

C++对象的放置的相关文章

Java编程思想学习笔记——一切都是对象

前言 Java是基于C++的,但Java是一种更加纯粹的面向对象程序设计语言. C++和Java都是混合/杂合型语言.杂合型语言允许多种编程风格. 用引用操纵对象 每种编程语言都有自己操纵内存中元素的方式. 直接操纵元素 用某种基于特殊语法的间接表示(C和C++里的指针) 用引用操纵对象(Java) 在Java中,一切都被视为对象.操纵的标识符实际上是对象的一个引用. 类比为遥控器(引用)来操纵电视机(对象) 只要把握这个遥控器,就能保持与电视机的连接 改变频道或减小音量,实际操纵的是遥控器(引

Bootstrap每天必学之媒体对象_javascript技巧

在Web页面或者说移动页面制作中,常常看到这样的效果,左边居左(或居右),内容居右(或居左)排列,如下图所示: 我们常常把这样的效果称为媒体对象.可以说他是一种抽像的样式,可以用来构建不同类型的组件.这些组件都具有开篇所说的样式风格.那么在Bootstrap框架中特意将些部分提取出来做来一个组件介绍.其对应的版本文件: LESS版本:对应的源文件是media.less Sass版本:对应的源文件是_media.scss 编译后版本:对应bootstrap.css文件第4792行-第4819行 1

如何在ASP.NET中用OWC绘制图表(2)

asp.net|图表 OWC.aspx.vb: Imports SystemImports OWCImports System.Web.UI Public Class OWC  Inherits System.Web.UI.Page  Protected WithEvents ChartHolder As System.Web.UI.WebControls.PlaceHolder #Region " Web 窗体设计器生成的代码 "   '该调用是 Web 窗体设计器所必需的.  &l

Photoshop教程06:Photoshop6倒转乾坤

教程 倒转乾坤?没有这么夸张吧?Wrong!Photoshop真的可以!让玉米哥来告诉你们吧.图片一开始就符合要求得情况是很少有的.把一幅图片中得对象复制到另外一幅图片中时,经常要把它放大或者缩小.也可能需要把倾斜线摆成水平,还有比如上下.左右翻转.在Photoshop中,只需要单击几次鼠标或者执行几条简单得命令,就能够完成这些操作.是不是很容易,下面我们开始吧. 重新设置尺寸 Photoshop可以很方便地改变图像或者其中任何对象的大小.这里可以有两种选择:重新设置图像的尺寸或者重新设置画布的

Oracle Database 10g:删除表

oracle 使用 Oracle Database 10g 中的闪回表特性,可以毫不费力地恢复被意外删除的表 以下是一个不该发生却经常发生的情况:用户删除了一个非常重要的表 - 当然是意外地删除 - 并需要尽快地恢复.(在某些时候,这个不幸的用户可能就是 DBA!) Oracle9i Database 推出了闪回查询选项的概念,以便检索过去某个时间点的数据,但它不能闪回 DDL 操作,如删除表的操作.唯一的恢复方法是在另一个数据库中使用表空间的时间点恢复,然后使用导出/导入或其他方法,在当前数据

把Oracle数据库移植到Microsoft SQL Server 7.0

oracle|server|数据|数据库  把Oracle数据库移植到Microsoft SQL Server 7.0 摘要:本文是为那些想把自己的Oracle应用程序转换为Microsoft SQL Server应用程序的开发人员编写的.本文描述了一个成功的转换所需要的工具.过程和技术.同时强调了建立高性能.高度并行的SQL Server应用程序的基本的设计要素. 本文的读者应该具有: Oracle关系型数据管理系统(RDBMS)的坚实基础. 普通数据库管理知识. 熟悉Oracle SQL和P

Flash MX 2004时间轴特效详细讲解

特效 今天给大家总结一下Flash mx 2004中的时间轴特效,希望对大家有帮助,并且提供了一个用时间轴做的实例,至于其它的具体简单使用则没给大家实例,希望大家按照说得好好练习下Flash的时间轴特效! 时间轴特效(Timeline effects)是Flash MX 2004和Flash MX Professional 2004都拥有的新功能.使用Flash内建的时间轴特效,可以快速创建复杂的动画,和Swish有些类似. 时间轴特效可以应用于以下对象:文本.图形(包括矢量图.组合对象和图符)

Flash制作精彩的空战游戏

越来越多的Flash爱好者已经不满足仅仅去欣赏别人制作的Flash,而是希望自己也能投入到Flash制作者的行列,成为一个Flash高手.今天,我们就用一个游戏实例让广大的Flash爱好者了解一下Flash在制作游戏时的基本思路和方法,文章末尾提供.fla原文件下载. 今天我们要做的是一个战斗机攻击敌机的游戏,启动游戏后,单击"start"按钮,游戏开始.用键盘的方向键控制战斗机,按空格键发射子弹摧毁敌机,每摧毁一架战斗机都会加上适当分数,如果分数大于500,就会胜利完成游戏.游戏中要

ASP.NET2.0轻松搞定统计图表

asp.net|统计|图表 本文讲述如何绘制条形图,折线图,柱形图,面积图等常见图形. 效果图: 手把手教程: 原理:OWC是Office   Web   Compent的缩写,即Microsoft的Office   Web组件,它为在Web中绘制图形提供了灵活的同时也是最基本的机制.在一个intranet环境中,如果可以假设客户机上存在特定的浏览器和一些功能强大的软件(如IE6和Office   2000/XP/2003),那么就有能力利用Office   Web组件提供一个交互式图形开发环境