C++对象的内存分布和虚函数表

Linux C/C+ +开发(后端/音视频/游戏/嵌入式/高性能网络/存储/基础架构/安全)

c++中一个类中无非有四种成员:静态数据成员和非静态数据成员,静态函数和非静态函数。

1.非静态数据成员被放在每一个对象体内作为对象专有的数据成员。
2.静态数据成员被提取出来放在程序的静态数据区内,为该类所有对象共享,因此只存在一份。
3.静态和非静态成员函数最终都被提取出来放在程序的代码段中并为该类所有对象共享,因此每一个成员函数也只能存在一份代码实体。在c++中类的成员函数都是保存在静态存储区中的 ,那静态函数也是保存在静态存储区中的,他们都是在类中保存同一个惫份。

因此,构成对象本身的只有数据,任何成员函数都不隶属于任何一个对象,非静态成员函数与对象的关系就是绑定,绑定的中介就是this指针。成员函数为该类所有对象共享,不仅是处于简化语言实现、节省存储的目的,而且是为了使同类对象有一致的行为。同类对象的行为虽然一致,但是操作不同的数据成员。

#include"iostream.h"
class A
{
private:int x;int y;
public:void sety(){y=5;}void print(){cout<<"x="<<x<<endl<<"y="<<y<<endl;}
};
void main()
{A a;a.sety();a.print();int *p=(int *)&a;//对象a的内存模型里面,只有非静态数据成员,所以是合理的。*p=6;a.print();
}

4.单继承的对象的内存布局,第一个为虚函数表指针vtbl,其后为成员且先基类后子类,虚函数表里包含了所有的虚函数的地址,以NULL结束。 虚函数如果子类有重写,就由子类的重新的代替

img

添加图片注释,不超过 140 字(可选)

上述类图的解释:B的v2覆盖了A的v2,C的v1覆盖了A的v1,C的v3覆盖了B的v3.

注意:发生覆盖的特征有:

  1. 不同的范围(分别位于派生类与基类);
  2. 函数名字相同
  3. 参数相同
  4. 基类函数必须有virtual关键字

成员函数被重载的特征

(1)相同的范围(在同一个类中);
(2)函数名字相同;
(3)参数不同;
(4)virtual 关键字可有可无

隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下

(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)

类C的对象的内存模型为:

img

单继承的对象的布局,第一个为虚函数表指针vtbl,其后为成员且先基类后子类,虚函数表里包含了所有的虚函数的地址,以NULL结束。虚函数如果子类有重写,就由子类的重新的代替。

5.与单继承相同的是所有的虚函数都包含在虚函数表中,所不同的多重继承有多个虚函数表,当子类对父类的虚函数有重写时,子类的函数替换父类的函数在对应的虚函数位置,当子类有新的虚函数时,这些虚函数被加在第一个虚函数表的后面

img

对类图的解释:D的v3覆盖了B3的v3,另外D有一个新的虚函数vD。

class D 的内存模型

img

总结:与单继承相同的是所有的虚函数都包含在虚函数表中,所不同的多重继承有多个虚函数表**,当子类对父类的虚函数有重写时,子类的函数覆盖父类的函数在对应的虚函数位置,当子类有新的虚函数时,这些虚函数被加在第一个虚函数表的后面**

6.虚继承,使公共的基类在子类中只有一份,我们看到虚继承在多重继承的基础上多了vbtable来存储到公共基类的偏移。

img

类图的解释:D2覆盖了B的vB,GD覆盖了D1的vD1同时也覆盖B的vB,GD也有自己的虚函数vGD。

class GD的内存模型

img

总结:虚继承,使公共的基类在子类中只有一份,我们看到虚继承在多重继承的基础上多了vbtable来存储到公共基类的偏移

整理了一些学习书籍、视频资料(Linux C++ 后端/音视频/游戏/嵌入式/高性能网络/存储/基础架构/安全
学习资料、教学视频和学习路线图),有需要的可以自行添加学习交流群:739729163 领取哦!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/176806.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp leven系列原生插件(2)

目录 11.安卓客户端之间wifi文件传输 插件介绍 插件地址 预览图片 12.安卓热敏打印机打印插件 插件介绍 插件地址 使用文档 预览图片 13.安卓TCP原生插件 插件介绍 插件地址 使用文档 预览图片 14.安卓文字转拼音原生插件 插件介绍 插件地址 使用文档 预览图…

迅镭激光董事长颜章健荣膺“2023年如皋市科技强企人物”!

10月28日&#xff0c;2023如皋科技人才洽谈会开幕式在如皋隆重举行。江苏省科学技术厅副厅长、党组成员蒋洪&#xff0c;江苏省商务厅副厅长、党组成员孙津&#xff0c;中共南通市委副书记、政法委书记沈雷&#xff0c;中共如皋市市委书记何益军&#xff0c;中共如皋市委副书记…

人人都能看懂的DDPM反向降噪过程公式推导

0 前言 上一篇介绍了前向加噪过程&#xff0c;得到如下从 x 0 x_0 x0​ 一步到 x t x_t xt​ 过程&#xff1a; α t β t 1 \alpha_t \beta_t1 αt​βt​1&#xff0c;其中 β t \beta_t βt​ 是正态分布方差&#xff0c;即第 t t t 步产生的噪声从 N ( 0 , β t ) …

效率提升测试工具开发的思考

本文针对测试部效率提升测试工具开发、管理、维护暴露出来的问题的一些思考以及一些个人改进观点。 写在前面 本文提到的效率提升测试工具不是指的部门中固有的自动化测试工具&#xff0c;这里提到的测试工具统一指测试人员在工作之余自主开发用于期望替代重复、繁琐、耗时的手…

【设计模式】第6节:创建型模式之“原型模式”

由于本人现在所使用的语言主要是golang&#xff0c;所以后面的代码主要使用golang编写。语言实现应该不是障碍&#xff0c;主要是理解每种设计模式它的思想。 如果对象的创建成本比较大&#xff0c;而同一个类的不同对象之间差别不大&#xff08;大部分字段都相同&#xff09;…

【金银钻思】

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

希亦T800 Pro双滚刷双活水洗地机发布:颠覆纯水洗,水汽混动技术的旗舰新杰作

11月1日&#xff0c;CEYEE希亦正式发布首款双滚刷双活水洗地机&#xff0c;集吸尘、洗拖、烘干于一体&#xff0c;双刷双喷淋一分钟洗地机1000次&#xff0c;可达10倍洁净效果&#xff01;该产品已正式在各大平台上开售&#xff0c;首发价2399元。 近年来&#xff0c;洗地机市…

Redis 原理缓存过期、一致性hash、雪崩、穿透、并发、布隆、缓存更新策略、缓存数据库一致性

redis过期策略 redis的过期策略可以通过配置文件进行配置 一、定期删除 redis会把设置了过期时间的key放在单独的字典中&#xff0c;定时遍历来删除到期的key。 1&#xff09;.每100ms从过期字典中 随机挑选20个&#xff0c;把其中过期的key删除&#xff1b; 2&#xff09;.…

UWB 技术在机器人和移动领域的应用题】

多年来&#xff0c;机器人生态系统不断增长&#xff0c;不同的应用程序也在不断增长。如今&#xff0c;机器人出现在许多不同的领域&#xff0c;例如私人家庭、商业场所、仓库和医疗场所。他们要么自主工作&#xff0c;要么与我们并肩工作&#xff0c;帮助我们完成任务。 根据…

Unity Editor工具,导出unitypackage可选择是否包含脚本

概述 Unity自带的Export Package...功能&#xff0c;如果选中资源中包含脚本&#xff0c;或者Prefab挂载了自定义的脚本。在之后弹出的选择框内&#xff0c;如果勾选了Include dependencies会将整个项目所有的脚本全部都包含在内。等于导入了很多不相关的代码。如果取消勾选In…

soul协议算法

逆向工程技术是指对软件或应用程序进行逆向分析以了解其内部机制和功能的过程。虽然我无法详细介绍"Soul App"的逆向工程技术&#xff0c;但以下是一些常见的逆向工程技术&#xff0c;可能与你的研究相关&#xff1a; 1. 反汇编&#xff08;Disassembly&#xff09;…

[javaweb]——HTTP请求与响应协议,常见响应状态码(如:404)

&#x1f308;键盘敲烂&#xff0c;年薪30万&#x1f308; 目录 HTTP概述 &#x1f4d5;概念&#xff1a;Hyper Text Transfer Protocol&#xff0c;超文本传输协议&#xff0c;规定了浏览器和服务器之间数据传输的规则。 &#x1f4d5;特点&#xff1a; &#x1f4d5;插播…

ORANGE室内高尔夫—韩国室内模拟高尔夫原装进口真实体验身临其境

ORANGE室内高尔夫—韩国室内模拟高尔夫 真实体验 身临其境 室内高尔夫的产品优势&#xff1a; 1. 实际高尔夫球场的限制&#xff1a;室内高尔夫可以弥补室外高尔夫球场数量有限的问题&#xff0c;使得更多人能够享受高尔夫运动。 2. 天气和季节的限制&#xff1a;室内高尔夫可…

Expected indentation of 16 spaces but found 8 spaces.eslintvue/script-indent

问题&#xff1a;Expected indentation of 16 spaces but found 8 spaces.eslintvue/script-indent 原因&#xff1a; 严格地检查缩进问题&#xff0c;并不是报错 解决&#xff1a; 方法一&#xff1a;我们可以关闭这个检查规则&#xff08;好像没用&#xff09; .eslintrc.js…

一台服务器安装两个mysql、重置数据库用于测试使用

文章目录 一、切数据库数据存储文件夹已经存在数据库数据文件夹新建数据库数据文件夹 二、安装第二个mysql安装新数据库初始化数据库数据启动数据库关闭数据库 参考文档 一、切数据库数据存储文件夹 这个方法可以让你不用安装新的数据库&#xff0c;就可以得到一个全新的一个数…

图傅里叶变换

目录 什么是图信号&#xff1f; 如何理解图信号的”谱“&#xff1f; 图傅里叶变换是什么&#xff1f; 图傅里叶变换中特征值和图信号的总变差有什么关系&#xff1f; 让我们先总结一下&#xff0c;我们想要把图信号 正交分解到一组基 上&#xff1b; 那么怎么得到&#x…

MySQL 基础学习笔记(二)

目录 1 约束1.1 约束概述1.2 非空约束1.3 唯一约束1.4 主键约束1.5 默认约束1.6 外键约束 2 数据库设计2.1 数据库设计概述2.2 表关系 3 多表查询3.1 多表查询概述3.2 内连接查询3.3 外连接查询3.4 子查询 4 事务4.1 事务概述4.2 四大特征 1 约束 1.1 约束概述 约束是作用于表…

Labview2018安装教程(超级详细)

网盘资源见文末 一 .简介 LabVIEW 2017是National Instruments&#xff08;NI&#xff09;开发的一款图形化编程环境。LabVIEW是一种流程导向的编程语言&#xff0c;它使用图形符号表示程序的逻辑和数据流&#xff0c;并且以数据流的方式执行程序&#xff0c;使得用户可以通过…

双证齐发!移远通信通过ISO 26262功能安全流程认证及产品认证

近日&#xff0c;国际知名的认证和咨询机构法国BV&#xff08;Bureau Veritas&#xff09;向移远通信颁发了ISO 26262&#xff1a;2018功能安全ASIL B流程认证证书&#xff0c;同时为移远车规级GNSS模组LG69T&#xff08;AB&#xff09;颁发了ISO 26262 ASIL-B产品认证证书。移…

Java多线程篇(13)——FutureTask、Disruptor的使用

文章目录 FutureTaskCompletionServiceCompletableFuture DisruptorDisruptor 核心概念运行流程不同生产者模式的区别Disruptor设计精髓 FutureTask 现有一个场景&#xff0c;10个线程执行10个任务&#xff0c;然后主线程获取任务结果。 比较广泛的一个说法就是&#xff0c;r…