`
zhangziyueup
  • 浏览: 1173286 次
文章分类
社区版块
存档分类
最新评论

C++ class实例的内存结构

 
阅读更多
C++ class实例的内存结构
Author:zfive5(zidong)
Email:zfive5@yahoo.com.cn
引子
这些天让一些概念和算法烦得不知所措,只能听从佛祖教诲的:放下,然后上csdn去,看了两篇关于c++的文章,这个年头,能这样拷问“茴”字多个写法的人不多了,在这里赞一下,但里面的一些东西还是没有挖掘干净,所以有了写一些东西的冲动.
正文
在c++中,一个类虚函数表指针和成员是如何在内存中组织的大家看前面的文章已经很清楚了,但如果出现一堆继承关系后,它们又是怎样在内存结构组织的,这里并不想用汇编语言来说明,而是直接看数据区的内存里的内容来推演出结论。
要实验的类继承结构关系图如下:

其中成员函数都是虚函数,成员变量在构造函数里初始化成如下,便于发现内容边界:
A:
iA1=0xA1A1A1A1;
iA2=0xA2A2A2A2;
B:
iB1=0xB1B1B1B1;
iB2=0xB2B2B2B2;
C:
iC1=0xC1C1C1C1;
iC2=0xC2C2C2C2;
D:
iD1=0xD1D1D1D1;
iD2=0xD2D2D2D2;
E:
iE1=0xE1E1E1E1;
iE2=0xE2E2E2E2;
代码如下:
int _tmain(int argc, _TCHAR* argv[])
{
A *pA=NULL;
B *pB=NULL;
C *pC=NULL;
D *pD=NULL;
E *pE=NULL;
pE= new E();
pA=pE;
pB=pE;
pC=pE;
pD=pE;
return 0;
}
在监视器里看到变量内容如下:
pE 0x003e9e58 {iE1=-505290271 iE2=-488447262 } E *
pB 0x003e9e58 {iE1=-505290271 iE2=-488447262 } B *
pA 0x003e9e64 {iE1=-505290271 iE2=-488447262 } A *
pC 0x003e9e64 {iE1=-505290271 iE2=-488447262 } C *
pD 0x003e9e78 {iE1=-505290271 iE2=-488447262 } D *
综合一下就可以得到这样的内存结构:
如果类里面没有虚函数的话,在上表里就没有对应的那个虚函数表指针。
虚函数表指针指向内存也同样可以看内存得出如下内容:
0x00417640:
03 12 41 00(HelloB)
6e 10 41 00(HelloE)
00 00 00 00(NULL)
0x00417688:
6c 12 41 00 (C的析构函数)
90 11 41 00 (HelloA)
37 10 41 00 ( HelloC)
00 00 00 00 (NULL)
(以前有错误,已改正,谢谢网友danielhua指出)
0x0041767c:
76 12 41 00 (HelloD)
00 00 00 00 (NULL)
以上实验分析是在vc++ 2005环境下进行的,估计vc6.0也是如此的内存分布,但gc++一定有所不同(以前看过一些相关的文章,今天本来想下载一个cygwin0528安装包验证一下,结果g了半天,全都是死连接,等回到北京再去实验一下吧)
向拔掉的第一颗牙,说再见,拔牙的痛苦的耐人寻味!以后一定更加珍惜爱护自己的牙!!!
相关文章
分享到:
评论

相关推荐

    C++单实例模式示例代码

    class CSingleton { //其他成员 public: static CSingleton* GetInstance() { if ( m_pInstance == NULL ) //判断是否第一次调用 m_pInstance = new CSingleton(); return m_pInstance; } private: ...

    C++单例模式应用实例

    本文实例讲述了C++单例模式及其相关应用方法,分享给大家供大家参考。具体方法分析如下: 定义: 一个类有且仅有一个实例,并且提供一个访问它的全局访问点。 要点: 1、类只能有一个实例; 2、必须自行创建此实例;...

    C++线性表与约瑟夫数组_数据结构与算法实验一_艾孜尔江·艾尔斯兰著.zip

    本实验资源内附详细的指导教程和演示案例,通俗易懂,由艾孜尔江·艾尔斯兰亲自实验并撰著而成,均为底层开发,可供研究和学习使用,平时工作中亦可实践,是初学者深入学习数据结构与算法的法宝,基于C++语言实现,...

    Visual C++实践与提高-COM和COM+篇『PDF』

    2.3.2.1 什么是抽象基类(Abstract Base Class) 2.3.2.2 实现秘诀:虚函数(Virtual Functions) 2.3.3 使用抽象基类 2.3.4 例程实现 2.3.4.1 修改接口文件 2.3.4.2 修改对象程序 2.3.4.3 修改客户程序 2.4 改由COM...

    C++11新特性之Class

    这是C++11新特性介绍的第六部分,涉及到Class的相关内容。  不想看toy code的读者,可以直接拉到文章后看这部分的总结。  sizeof  新标准中,sizeof可以直接用于获取Class::member的大小,而不用通过Class的...

    Essential C++英文版

    循此方式,你不只学到C++的函数和结构,也会学习到它们的设计目的和基本原理。 你可以由本书发现以下关键主题: ● Generic (泛型)编程风格和Standard Template Library(STL) ● Object-based(个别对象)编程风格和...

    简单的C++程序论文

    简单的C++通讯录,有class类,有多个对象,本程序可用作简单的通讯录应用。主要是以论文写的。

    C++ sizeof 实例解析

    在C++中使用sizeof要比C复杂很多,因为C++类中有static静态变量,virtual虚函数,还有继承、派生等。sizeof是C语言的一种单目操作符,如C语言的其他操作符++、–等。它并不是函数。sizeof操作符以字节形式给出了其...

    Essential C++中文版(侯捷译)

    循此方式,你不只学到C++的函数和结构,也会学习到它们的设计目的和基本原理。 你可以由本书发现以下关键主题: ● Generic (泛型)编程风格和Standard Template Library(STL) ● Object-based(个别对象)编程风格和...

    C++ 实现哈希表的实例

    C++ 实现哈希表的实例 该散列表的散列函数采用了除法散列函数、乘法散列函数、全域散列函数,每一个槽都是使用有序单向链表实现。 实现代码: LinkNode.h #include using namespace std; class Link; class ...

    深入解析C++ Data Member内存布局

    那么class A的每个实例占用1个字节的内存,编译器会会在这个其实例中安插一个char,以保证每个A实例在内存中有唯一的地址,如A a,b;&a!=&b。如果一个直接或是间接的继承(不是虚继承)了多个类,如果这个类及其父类...

    新手学习C++入门资料

    输入和输出是通过C++类来实现的,cin和cout是这些类的实例,他们是在C++语言的外部实现。 在C++语言中,有了一种新的注释方法,就是‘//’,在该行//后的所有说明都被编译器认为是注释,这种注释不能换行。C++中...

    vc++ 开发实例源码包

    template<class T, class TBas> class CMultiPageDHtmlDialogImpl; autoplaysnd mp3 播放器源码 重载了自带的控件进行播放 aviplayer avi播放器源码 引用了atl控件播放 beautifulskin 源码 演示了各种控件方法 ...

    C++ 虚函数的详解及简单实例

    C++ 虚函数的详解 虚函数的使用和纯虚函数的使用。 虚函数是在基类定义,然后子类重写这个函数后,基类的指针指向子类的对象,可以调用这个函数,这个函数同时保留这子类重写的功能。 纯虚函数是可以不用在基类定义...

    C++术语表

    C++术语对照表 大全,abort() 特殊函数 如果一个函数抛出异常,但在通往异常函数的调用链中找不到与之匹配的catch,则该程序通常以此函数调用终止 abstract base class 抽象基类 abstract class 抽象类 无实例对象...

    C++.几个小例子

    c++语言实例#include const int N=1000000; class set { int IntArray[N]; int last; public: int Append(); int Delete(); int Nember(int x); int Empty(); int Full(); void Display(); void find(); ...

    C++实现String类实例代码

    C++实现String类实例代码 这是一道十分经典的面试题,可以短时间内考查学生对C++的掌握是否全面,答案要包括C++类的多数知识,保证编写的String类可以完成赋值、拷贝、定义变量等功能。 #include using namespace ...

    记录学习完C语言后,学习C++的过程,实现从C语言到C++的过渡 使用的IDE是QT.rar

    C++是面向对象编程(即有class以及相关工具) 2.如何从C过渡到C++ 2.1 代码实例:(C语言版)uva11000.重点不在于解上面这题,请将重点放在写法。以上是C语言写法,为什么说是C语言写法呢?因为上述代码有几个C独有...

    C++联合体union用法实例详解

    本文实例讲述了C++联合体union用法。分享给大家供大家参考。具体如下: 我们应该按照C中的convention去使用union,这是我这篇文章要给出的观点。虽然C++使得我们可以扩展一些新的东西进去,但是,我建议你不要那样去...

    C++归并算法实例

    本文实例讲述了C++归并算法。分享给大家供大家参考。具体如下: /* 归并算法:把两个或两个以上的线性表合并在一起,形成一个新的线性表 函数模版的基本使用 程序意图:将两个相同类型的线性表元素排好序,然后...

Global site tag (gtag.js) - Google Analytics