C++对象内存模型结构

Wesley13
• 阅读 636

2. 单一继承派生类对象内存结构

2.1 普通C++对象单一继承内存结构

class CObject { private: int mv1; long long mv2; char mv3;

public: int GetValue1() const; void SetValue1(int val); };

class CObjectA : public CObject { private: long long mv4; long long mv5;

public: long long GetValue4() const; void SetValue4(long long val); };

C++对象内存模型结构

(1) 普通C++派生类对象内存结构中,仅包含父类和子类的成员变量。

(2) 成员变量在内存中按照先父类后子类的顺序逐个排列。

(3) 父类和子类对象指针,都指向该对象实例内存首地址。

2.2 带有虚函数的C++对象单一继承内存结构

class CObject2 { private: private: int mv1 {1}; long long mv2 {2}; char mv3 {3};

public: virtual ~CObject2();

virtual long long GetValue2() const;
virtual void SetValue2(long long val);

};

class CObject2A : public CObject2 { public: long mv4 {4}; long mv5 {5};

public: virtual long GetValue5() const { return mv5; } };

C++对象内存模型结构

(1) 对象结构顶部多出一个虚表指针,指向CObject2A虚表的第三个字段。虚标指针后面,各个字段按照先父类后子类的顺序逐个排列。

(2) CObject2A的虚表结构是对CObject2虚表的扩展,并在内容上兼容CObject2虚表。

(3) CObject2A的虚表从第三个字段开始,依次是虚构函数指针(D1Ev和D0Ev),后面是各个要方法按照先弗雷后子类的顺序逐个排列。

(4) delete操作时,会调用D0Ev的虚构函数。D0Ev0首先调用D1Ev,然后释放当前内存。

(5) D1Ev除了执行CObject2A的析构逻辑外,还会调用基类CObject2的D1Ev析构方法,实现递归析构。

点赞
收藏
评论区
推荐文章
cpp加油站 cpp加油站
3年前
c++头脑风暴-多态、虚继承、多重继承内存布局
本篇文章深入分析多态、虚继承、多重继承的内存布局以及实现原理。首先还是看一下思维导图:下面根据这个大纲一步一步的进行深入解析。一、没有虚函数时内存布局是怎样的1.没有虚函数时类的内存布局一个类没有虚函数的时候,其实就是结构体,它的内存布局就是按照成员变量的顺序来的。看如下代码:cppinclude<iostreamusingnamespaces
Wesley13 Wesley13
3年前
java中经常问到的面试题
1、面向对象编程的三大特性是什么?(1).继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例
Wesley13 Wesley13
3年前
DLL 函数中使用结构体指针作函数参数(C# 调用 C++ 的 DLL)
存在的问题:问题1:C与C同样定义的结构体在内存布局上有时并不一致;问题2:C中引入了垃圾自动回收机制,其垃圾回收器可能会重新定位指针所指向的结构体变量。解决方案:问题1方案:强制指定C、C结构体的内存布局,使其一致(两者都固定为:结构体的成员按其声明时出现的顺序依次布局,结构体成员的内存对齐为1字节对齐);为题
Wesley13 Wesley13
3年前
C++内存管理
C内存管理一、内存分配方式在C中,内存分成5个区,分别是堆、栈、自由存储区、全局/静态区和常量存储区。栈:存放函数参数以及局部变量,在出作用域时,将自动被释放.栈内存分配运算内置于处理器的指令集中,效率
Wesley13 Wesley13
3年前
Go语言中通过结构体匿名字段实现方法的继承和重载
Go语言中的结构体可以定义匿名字段。Go语言中没有对象,但是结构体却有大量对象的功能。并且用匿名字段的确可以实现对象的继承和重载。packagemain import "fmt"  typeA struct{     x int }  typeA1 struct{
Stella981 Stella981
3年前
JVM系列【6】GC与调优1
JVM系列笔记目录虚拟机的基础概念class文件结构class文件加载过程jvm内存模型JVM常用指令GC与调优GC基础知识什么是垃圾​没有任何引用指向的一个对象或多个对象(循环引用)!file(https:
Wesley13 Wesley13
3年前
C++ 类与结构体 构造函数 详细相关理解整理
说到构造函数,通常是将讲对象创建时编译器自动调用构造函数为对象初始化,也可以说是分配内存空间。 学习了构造函数相对其中牵涉到的一些点作下大概的了解和学习,整理一下只是点。这里主要说下 类与结构体的差异/类与结构体包含继承关系时的构造调用/类的初始化列表/默认构造函数/拷贝构造函数以及牵涉到的相关内容结构体和类的区别
Wesley13 Wesley13
3年前
C++ 内存管理
程序员们经常编写内存管理程序,往往提心吊胆。如果不想触雷,唯一的解决办法就是发现所有潜伏的地雷并且排除它们,躲是躲不了的。本节的内容比一般教科书的要深入得多,读者需细心阅读,做到真正地通晓内存管理。<br/一、内存分配方式内存分配方式有三种:(1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整
PostgreSQL:内存结构
本文分享自天翼云开发者社区@《》,作者:我是小朋友在Postgresql中,内存大概被分为两块Localmemoryarea:为每一个backendprocess分配的内存Sharedmemoryarea:PostgreSQLserver所有的backgr