分类:C
2011-01-16 09:40 阅读(379)评论(0)编辑删除
一、没有虚函数,没有继承的类内存结构:
1.如下定义一个类:
class A
{
public:
void seta(int x) {a = x;};

void setb(int x) {b = x;};
int  sum() {return a+b;};
private:

int a;
int b;
};
A test;
当实例化以后,实际上实例test的内存结构只有两个变量成员a和b;
而类的函数在操作时,其输入参数比实际看到的多一个,即寄存器ecx,ecx指向实例地址。比如在例子中,函数seta的代码是如下的:

       mov     eax, [esp+arg_0]
       mov     [ecx], eax
       retn    4
也就是说,A.seta的实际上可以这样写: void seta(&A,int x);
2.在类中,变量是按定义的顺序组织的。不管这些变量是public,privated还是protected。
二、没有虚函数,有继承的类内存结构:
class A
public:
void seta(int x){a = x;};
privated:
int a;
};
class B:class A
{
public:
void setb(int x){b = x;};
privated:
int b;
};
在这样的实例中,先分配父类变量,再分配子类变量。
如果是多重继承的话,则按顺序分配父类的变量。
三、有虚函数,没有继承的类内存结构:
若果类中含有虚函数时,类对象的内存分配有不一样的地方。如:
class A
{
public:
virtual init(int x,int y){a = x;b = y;};
virtual init(){a = 0;b=0;};
int sum();
priviate:
int a,b;
}
此时,在类实例内存中,首先是虚函数表指针,然后才分配变量。
vc6编译器下,当虚函数个数为偶数时,已0xffffffff结束。为奇数时,先填充0,再已0xffffffff结束。
四、有虚函数,单继承的类内存结构:
单继承关系分为虚函数覆盖和不覆盖两种,当不覆盖时,虚函数表先是父类的虚函数表,然后是子类的虚函数表,当覆盖时,同样排序,但父类的被覆盖虚函数地址为子类的相应的虚函数的地址。
变量的分配和上面的相同。
五、有虚函数,多继承的类内存结构:
class C
{
public:
  virtual C1(){return 1;};
  virtual C2(){return 2;};
  setc(int x){c = x;};
private:
  int c;
};
class B
{
public:
  virtual B1(){d1=1;};
  virtual B2(){d2=2;};
private:
  int d1;
  int d2;
};
 
class A
{
public: 
  int sum(){return a1+a2;};
  virtual  A1(int x,int y){a1 = x;a2 = y;};
  virtual  A2(){a3=0;};
  virtual  A3(int x){a3 = x;};
  virtual  A4(){a1*a2*a3;};
private:
  int a1;
  int a2;
  int a3;
};
class D:public A,public B,public C
{
public:
  virtual D1(int x,int y){d1=x+10;d2=y+10;d3=d1*5;d4=d2*7;};
  virtual D2(){return 8;};
private:
  int d1,d2,d3,d4; 
};
此时,类D 的实例的内存分配应该如下:
A的虚函数表指针,紧跟这个虚函数表的是D的虚函数地址。
A的变量分配
B的虚函数表指针
B的变量分配
C的虚函数表指针
C的变量分配
D的变量分配
如果有虚函数覆盖,则和上面描述相同,用D的虚函数地址覆盖相应的父类的虚函数表中虚函数的地址。

C++类内存结构布局相关推荐

  1. Jvm 系列(二):Jvm 内存结构

    所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢?OutOfMemoryError的异常到底涉及到运行时数据的哪块区域?该怎么解决呢?其实如果你经常解决服务器性能问题,那么这些问 ...

  2. jvm系列(二):JVM内存结构

    所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢?OutOfMemoryError的异常到底涉及到运行时数据的哪块区域?该怎么解决呢?其实如果你经常解决服务器性能问题,那么这些问 ...

  3. C++_类和结构体所占内存大小,静态成员问题

    C++_类和结构体所占内存大小,静态成员问题 静态成员未初始化或者未调用(当然静态成员必须类外初始化才能调用)是不占内存的.静态成员不占类或结构体的内存 静态成员函数同样只声明未定义同样不占内存 指针 ...

  4. ART虚拟机 _ Java对象和类的内存结构,java中级面试题库weixin

    当我们想要创建一个java.lang.Class类的实例(类对象)时,以下三种方法可供选择: Class.forName("className") MyClass.class ob ...

  5. 转:JAVA常见错误处理方法 和 JVM内存结构

    OutOfMemoryError在开发过程中是司空见惯的,遇到这个错误,新手程序员都知道从两个方面入手来解决:一是排查程序是否有BUG导致内存泄漏:二是调整JVM启动参数增大内存.OutOfMemor ...

  6. 什么时候应该在C ++中使用类与结构?

    在哪种情况下,在C ++中使用struct比使用class更好? #1楼 它们是相同的东西,具有不同的默认值(对于class默认为private,对于struct默认为public),因此从理论上讲它 ...

  7. JVM【带着问题去学习 01】什么是JVM+内存结构+堆内存+堆内存参数(逃逸分析)

    1.是什么 (1) 基本概念:可运行 Java 代码的非真实计算机 ,包括一套字节码指令集.一组寄存器.一个栈.一个垃圾回器,堆和一个存储方法域.它运行在操作系统之上,与硬件没有直接的交互. (2) ...

  8. JAVA常见错误处理方法 和 JVM内存结构

    OutOfMemoryError在开发过程中是司空见惯的,遇到这个错误,新手程序员都知道从两个方面入手来解决:一是排查程序是否有BUG导致内存泄漏:二是调整JVM启动参数增大内存.OutOfMemor ...

  9. Java对象内存结构

    转载自 Java对象内存结构 学C/C++出身的我,对Java有一点非常困惑,那就是缺乏计算对象占用内存大小的机制.而在C++中就可以通过sizeof运算符来获得基本类型以及类实例的大小.C和C++中 ...

最新文章

  1. 比特币耶稣Roger Ver:BCH是世界上最创新、最实用的加密货币之一
  2. context-param和init-param的区别
  3. 火炬之光2找不到服务器,火炬之光2无法运行解决办法详细介绍
  4. 计算机数学基础模拟试题,计算机数学基础》模拟考试试题.doc
  5. python爬虫基础扫盲之urllib.pase解析URL
  6. maven打包报错:Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.5:test
  7. 使用dos下的命令行,也可以完成wifi连接。
  8. LVS详解(七)——LVS TUN模式实战
  9. 看看人家怎么学英语,用一年时间从六级水平到考上欧盟口译司!(转载)
  10. 07 -模型层ORM
  11. 用PPT制作 电子相册,进行抽奖准备.
  12. JMX实现远程服务器Tomcat系统监控之二
  13. 深度学习-各类数据集汇总
  14. 文科生学大数据分析吃力吗
  15. 如何设置计算机自动连接宽带,宽带连接怎么设置,怎么设置宽带自动连接
  16. 利用R语言如何判别和分类
  17. Java new一个对象
  18. PostMan配置动态token
  19. Day499500501502503504.马士兵22春招面试题① -面经
  20. vue 导出excel表格 自定义表结构

热门文章

  1. 国内外知名工业交换机品牌有哪些?
  2. POE供电交换机技术分析及工作过程详解
  3. 为什么在极端恶劣环境下不能使用商用以太网交换机?
  4. 21秋期末考试土力学与地基基础10445k1
  5. 【渝粤教育】电大中专混凝土结构作业 题库
  6. 国家开放大学2021春1257混凝土结构设计原理题目
  7. java判断是否第一次出现_利用java判断字符首次出现的位置,java替换最后一个特定字符...
  8. redisson的锁的类型_厉害了,中间件Redisson原来这么好用!
  9. 现代交换技术学习笔记001
  10. mysql执行系统命令_mysql 命令行执行 sql