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结束。 虚函数如果子类有重写,就由子类的重新的代替。

添加图片注释,不超过 140 字(可选)
上述类图的解释:B的v2覆盖了A的v2,C的v1覆盖了A的v1,C的v3覆盖了B的v3.
注意:发生覆盖的特征有:
- 不同的范围(分别位于派生类与基类);
- 函数名字相同;
- 参数相同;
- 基类函数必须有virtual关键字。
成员函数被重载的特征
(1)相同的范围(在同一个类中);
(2)函数名字相同;
(3)参数不同;
(4)virtual 关键字可有可无。
“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下
(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)
类C的对象的内存模型为:

单继承的对象的布局,第一个为虚函数表指针vtbl,其后为成员且先基类后子类,虚函数表里包含了所有的虚函数的地址,以NULL结束。虚函数如果子类有重写,就由子类的重新的代替。
5.与单继承相同的是所有的虚函数都包含在虚函数表中,所不同的多重继承有多个虚函数表,当子类对父类的虚函数有重写时,子类的函数替换父类的函数在对应的虚函数位置,当子类有新的虚函数时,这些虚函数被加在第一个虚函数表的后面。

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

总结:与单继承相同的是所有的虚函数都包含在虚函数表中,所不同的多重继承有多个虚函数表**,当子类对父类的虚函数有重写时,子类的函数覆盖父类的函数在对应的虚函数位置,当子类有新的虚函数时,这些虚函数被加在第一个虚函数表的后面**
6.虚继承,使公共的基类在子类中只有一份,我们看到虚继承在多重继承的基础上多了vbtable来存储到公共基类的偏移。

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

总结:虚继承,使公共的基类在子类中只有一份,我们看到虚继承在多重继承的基础上多了vbtable来存储到公共基类的偏移
整理了一些学习书籍、视频资料(Linux C++ 后端/音视频/游戏/嵌入式/高性能网络/存储/基础架构/安全
学习资料、教学视频和学习路线图),有需要的可以自行添加学习交流群:739729163 领取哦!!!
相关文章:
C++对象的内存分布和虚函数表
Linux C/C 开发(后端/音视频/游戏/嵌入式/高性能网络/存储/基础架构/安全) c中一个类中无非有四种成员:静态数据成员和非静态数据成员,静态函数和非静态函数。 1.非静态数据成员被放在每一个对象体内作为对象专有的数据成员。 2.静态数据成员被提取出来…...
小白怎么学习性能测试?一文7个知识点带你成功入门!
1.什么是性能测试 性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。负载测试和压力测试都属于性能测试,两者可以结合进行。通过负载测试,确定在各种工作负载下系统的性能,目标是测试当负…...
Orcad属性过滤器的使用技巧
Orcad内置的属性过滤器可以完美的解决由于属性太多导致的不好整理的问题。下面简单介绍一下方法和过程。 1、打开过滤器 2、新建属于自己的过滤器 3、进行器件属性过滤及调整的顺序(注这时一定关闭ORCAD,来操作) 3.1 安装目录下找到\Cadenc…...
腾讯云向量数据库正式对外全量开放公测
11月1日,腾讯云对外宣布向量数据库正式全量开放公测,同时性能层面带来巨大提升。腾讯云数据库副总经理罗云表示,除了公测之外,腾讯云向量数据库单索引已经支持百亿级向量规模,支持百万级QPS毫秒级查询延迟,…...
Linux新建普通用户无法使用退格键与tab键
创建普通用户 useradd mulan passwd mulan 切换用户 su mulan 发现普通用户无法使用退格键与tab键,一直显示如图 如图,按退格键(Backspace)、删除键出现 ‘^H’ 符号,tab键也不能自动拼写 这是新用户下的普通bash配置都没有,从…...
【湘粤鄂车牌】
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
华大-HC32L130F8UA 内存使用注意事项
1,概念 本系统包含一块 64K 字节( Byte )容量的 FLASH 存储器,共划分为 128 个页( Sector ),每个页( Sector ) 的容量为 512 字节( Byte )。 FLASH …...
怎样才知道一个单片机的性能到极限了?
怎样才知道一个单片机的性能到极限了? 就题主的问题,应该是想问CPU利用率的问题。可以看看Rt-thread中关于统计CPU利用率函数,其主要实现方式是在idle线程先关闭中断计数后,正常计数(可被其他线程打断),最近很多小伙伴…...
Android Studio的笔记--SerialPort串口通讯学习和使用
SerialPort串口通讯学习和使用 SerialPortandroid-serialport-api源码下载 Android-SerialPort-API源码下载readme版本 Android-SerialPort-Tool源码下载 Android-Serialport源码下载使用方法readme android中使用串口通信使用android-serialport-api方式第1种 链接第2种 导入S…...
MySQL 启动选项和字符集
1. 客户端和服务器 1.1 服务器程序 数据库实例:代表 MySQL 服务器程序的进程( mysqld 可执行文件) mysqld_safe:启动脚本,会间接调用 mysqld 并监控服务器运行状态。出现错误时可以帮助重启服务器程序,输…...
社区投稿|解码Big Vector,开启Sui超扩展性的新篇章
* 本文是来自Sui生态项目Typus团队的投稿,文中「我们」均指代该项目团队,转载时修改部分不准确的用词。 本研究报告介绍了Big Vector的概念,这是一种我们用于 Typus V2 的新数据结构,以缓解 Sui 上数组和动态字段(dynamic field)…...
Linux根目录下的目录结构及其作用详解
Linux根目录是文件系统的最顶层,它包含了一些子目录,每个子目录都有特定的功能和存储的文件。只有了解了各个文件的使用功能,才能更好的去使用Linux系统。希望通过下面这张图能够让你更加了解根目录下的各个目录的功能。...
源码和SaaS账号:租房与自建房的区别
在当今数字化时代,软件已成为企业运营的重要支撑。然而,对于许多中小企业来说,获取和运营软件的方式有两种:源码和SaaS账号。这两者有何区别呢?让我们用租房和自建房的比喻来解释。 价格比较 源码:购买源码…...
Docker容器设置为自动重启
有时Docker服务出现异常,或者服务器出现异常,需要重启Docker服务或者服务器; 如果希望有一部分基础的或者常用的容器,在服务或者服务器重启的时候,可以实现自动启动,仅需使用命令进行简单配置即可实现。 D…...
速卖通卖家如何通过自己搭建测评补单系统,提高产品权重和排名?
速卖通卖家如何给店铺增加权重和排名? 在竞争激烈的速卖通平台上,为自己的店铺增加权重是吸引更多买家和提升销售的关键。店铺的权重决定着在搜索排名、推荐位和广告展示方面的优先级。今天珑哥为您介绍一些有效的策略,帮助您提升速卖通店铺…...
香港金融科技周2023:AIGC重塑金融形态
10月31日,由香港财经事务及库务局与投资推广署主办的“香港金融科技周2023大湾区专场”盛大启幕。中国AI决策领先企业萨摩耶云科技集团创始人、董事长兼 CEO林建明受邀参加圆桌会议,与中国内地、香港以及全球金融科技行业顶尖人才、创新企业、监管机构和…...
6G关键新兴技术-智能超表面(RIS)技术演进
一、产品定义及范围 根据欧盟5G公私联盟协会(5G Infrastructure Public-Private Partnership, 5GPP)定义,可重构智慧表面(Reconfigurable Intelligent Surface, RIS)技术是由能够任意塑造电磁波面的材料组成,几乎是被动(Passice)设备,可以适…...
怎么让小程序排名靠前?小程序搜索排名问题
小程序的排名是十分重要的,因为这会直接影响到用户的点击率,用户在搜索小程序时,会看到搜索引擎的前几条搜索结果,如果您的小程序不在这些位置上,很可能就会被忽略,所以,想要让用户能够看到您的…...
使用Postman快速复现浏览器的请求(包括生成调用代码)
前言 大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。 好久没有写开发类的工具使用文了,这…...
四则运算的正则校验
文章目录 四则运算的正则校验带有变量的四则运算的正则校验带有括号的四则运算的正则校验变量使用${}包裹的四则运算正则表达式变量使用${}包裹的可以有括号的四则运算正则表达式变量使用#{}包裹的可以有括号的四则运算正则表达式变量使用${}或者 #{}包裹的可以有括号的四则运算…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
