C++语法小记---面向对象模型(实例的内存分布)

面向对象的模型(内存分布)
  • 对于一个对象而言,成员变量和成员函数是分开存放的

    • 成员函数位于代码段,所有的类对象共有
    • 成员变量为每一个对象独有,位于内存中
  • 类对象在内存中的分布和struct完全相同
  • 对于继承,子类的对象是在父类的对象的基础上,加上子类自己的成员
 1 #include <iostream>
 2 #include <string>
 3
 4 using namespace std;
 5
 6 class Test
 7 {
 8     int mi;
 9 public:
10     Test(int i = 0)  //转换构造函数
11     {
12         mi = i;
13     }
14
15     void showMI()
16     {
17         cout<<"Test mi = "<< mi <<endl;
18     }
19 };
20
21 class Test1: public Test
22 {
23     int mj;
24 public:
25     Test1(int j = 0)
26     {
27         mj = j;
28     }
29
30     void showMJ()
31     {
32         cout<<"Test mj = "<< mj <<endl;
33     }
34 };
35
36 struct T    //T的结构和Test2的内存结构完全相同
37 {
38     int mi;
39     int mj;
40 };
41
42 int main()
43 {
44     Test2 t;
45
46     T *p = reinterpret_cast<T *>(&t);
47     p->mi = 1;
48     p->mj = 2;
49
50     t.showMI();
51     t.showMJ();
52
53     return 0;
54 }
  • 如果类中有虚函数,那么对象中有一个指向虚函数类表的指针位于每一个对象中
 1 #include <iostream>
 2 #include <string>
 3
 4 using namespace std;
 5
 6 class Test
 7 {
 8     int mi;
 9 public:
10     Test(int i = 0)  //转换构造函数
11     {
12         mi = i;
13     }
14
15     virtual void showMI()
16     {
17         cout<<"Test mi = "<< mi <<endl;
18     }
19 };
20
21 class Test1: public Test
22 {
23     int mj;
24 public:
25     Test1(int j = 0)
26     {
27         mj = j;
28     }
29
30     virtual void showMJ()
31     {
32         cout<<"Test mj = "<< mj <<endl;
33     }
34 };
35
36 struct T    //T的结构和Test2的内存结构完全相同
37 {
38     void *p;
39     int mi;
40     int mj;
41 };
42
43 int main()
44 {
45     Test2 t;
46
47     T *p = reinterpret_cast<T *>(&t);
48     p->mi = 1;
49     p->mj = 2;
50
51     t.showMI();
52     t.showMJ();
53
54     return 0;
55 }
 1 #include <iostream>
 2 #include <string>
 3
 4 using namespace std;
 5
 6 class Test
 7 {
 8     int mi;
 9 public:
10     Test(int i = 0)  //转换构造函数
11     {
12         mi = i;
13     }
14
15     virtual void showMI()
16     {
17         cout<<"Test mi = "<< mi <<endl;
18     }
19 };
20
21 class Test1
22 {
23     int mj;
24 public:
25     Test1(int j = 0)
26     {
27         mj = j;
28     }
29
30     virtual void showMJ()
31     {
32         cout<<"Test mj = "<< mj <<endl;
33     }
34 };
35
36 class Test2 : public Test, public Test1
37 {
38     int mk;
39 public:
40     Test2(int k = 0)
41     {
42         mk = k;
43     }
44
45     void showMK()   //增加了虚函数
46     {
47         cout<<"Test mk = "<< mk <<endl;
48     }
49 };
50
51 struct T    //T的结构和Test2的内存结构完全相同
52 {
53     void *p;   //多了一个指向虚函数表的指针
54     int mi;
55     void *p1;  //多了一个指向虚函数表的指针
56     int mj;
57     int mk;
58 };
59
60 int main()
61 {
62     Test2 t;
63
64     T *p = reinterpret_cast<T *>(&t);
65     p->mi = 1;
66     p->mj = 2;
67     p->mk = 3;
68
69     t.showMI();
70     t.showMJ();
71     t.showMK();
72
73     return 0;
74 }

原文地址:https://www.cnblogs.com/chusiyong/p/11311268.html

时间: 2024-10-28 15:12:45

C++语法小记---面向对象模型(实例的内存分布)的相关文章

【转载】图说C++对象模型:对象内存布局详解

原文: 图说C++对象模型:对象内存布局详解 正文 回到顶部 0.前言 文章较长,而且内容相对来说比较枯燥,希望对C++对象的内存布局.虚表指针.虚基类指针等有深入了解的朋友可以慢慢看.本文的结论都在VS2013上得到验证.不同的编译器在内存布局的细节上可能有所不同.文章如果有解释不清.解释不通或疏漏的地方,恳请指出. 回到顶部 1.何为C++对象模型? 引用<深度探索C++对象模型>这本书中的话: 有两个概念可以解释C++对象模型: 语言中直接支持面向对象程序设计的部分. 对于各种支持的底层

C++ 空类及类的大小(C++面向对象模型有提及)

初学者在学习面向对象的程序设计语言时,或多或少的都些疑问,我们写的代码与最终生编译成的代码却 大相径庭,我们并不知道编译器在后台做了什么工作.这些都是由于我们仅停留在语言层的原因,所谓语言层就是教会我们一些基本的语法法则,但不会告诉我们为什么这么做?今天和大家谈的一点感悟就是我在学习编程过程中的一点经验,是编译器这方面的一个具体功能. 首先:我们要知道什么是类的实例化,所谓类的实例化就是在内存中分配一块地址. 那我们先看看一个例子: #include<iostream.h> class a {

C++面向对象模型初探

C++面向对象模型初探 1. 基础知识 C++中的class从面向对象理论出发,将变量(属性)和函数(方法)集中定义在一起,用于描述现实世界中的类.从计算机的角度,程序依然由数据段和代码段构成. C++编译器如何完成面向对象理论到计算机程序的转化? 换句话:C++编译器是如何管理类.对象.类和对象之间的关系 具体的说:具体对象调用类写的方法,那,c++编译器是如何区分,是那个具体的类,调用这个方法那? 思考一下程序结果 #include "iostream" using namespa

PowerDesigner(八)-面向对象模型(用例图,序列图,类图,生成Java源代码及Java源代码生成类图)(转)

面向对象模型 面向对象模型是利用UML(统一建模语言)的图形来描述系统结构的模型,它从不同角度实现系统的工作状态.这些图形有助于用户,管理人员,系统分析人员,开发人员,测试人员和其他人员之间进行信息交流.这里主要介绍用例图,序列图和类图.   1.面向对象模型OOM 面向对象模型是利用UML的图形描述系统结构的模型,可以利用PowerDesigner的面向对象模型进行创建.PowerDesigner支持UML的下列图形. 用例图(User Case Diagram):通常用来定义系统的高层次草图

只运行一个实例以及内存泄漏检测

unit 使应用程序只运行一个实例; interface uses Windows; const  // - 互斥体唯一的名字  _Mutex_Name = '{19631971-1976-1981-1989-199319941995}'; var  _Mutex_Handle: THandle; implementation initialization // - 载入时调用的代码 // - 创建互斥体对象_Mutex_Handle := CreateMutex(nil, False, LPC

Asp.net MVC3 Razor语法小记

Asp.net MVC3 Razor语法小记 1.在MVC View中使用 三元运算符的方式:@(bool?"":"") 2.在@{}中输出一行:@:<html>.如果这一行的上下文在程序代码中则用:@Html.Raw(string.Format(""));而不是Html.Raw(); 3.Radio默认选中: @Html.RadioButtonFor(m => m.BookType, 0, new { @checked=&qu

python_如何为创建大量实例节省内存?

案例: 某网络游戏中,定义了玩家类Player(id, name, status,....),每有一个在线玩家,在服务器程序内有一个Player的实例,当在线人数很多时,将产生大量实例(百万级别) 需求: 如何降低这些大量实例的内存开销? 如何做? 首先要明白,python中的类可以动态的添加属性,实则在内存中有个__dict__方法维护了这种动态添加属性,它占有内存,把它关掉,不就达到省内存要求了? #!/usr/bin/python3 import time import sys class

JVM实例以及内存的分配机制

JVM:一台用来模拟计算机执行计算指令的虚拟计算机,拥有自己的指令,指令执行环境,虚拟内存等. 下面介绍虚拟机(JVM)--cpu,寄存器,内存,指令 ====================================================================================================== 1.创建JVM装载环境和配置(GetApplicationHome取得Java.exe进程的路径,chshi) 2.装载JVM.dll 3.初

【转】Snort语法规则说明及实例讲解

转载来自:[IPS分析]Snort语法规则说明及实例讲解 方向操作符:方向操作符"->"表示规则所施加的流的方向.方向操作符左边的ip地址和端口号被认为是流来自的源主机,方向操作符右边的ip地址和端口信 息是目标主机,还有一个双向操作符 "<>".它告诉snort把地址/端口号对既作为源,又作为目标来考虑.这对于记录/分析双向对话很方 便,例如telnet或者pop3会话.用来记录一个telnet会话的两侧的流的范例如下: log !192.168