当前位置: 首页 > news >正文

C++虚继承内存布局

C++菱形继承内存布局

编译器:Visual Studio 2019
关于如何查看内存布局

B

class B
{
public:B(): _ib(10), _cb('B'){cout << "B()" << endl;}B(int ib, char cb): _ib(ib), _cb(cb){cout << "B(int,char)" << endl;}virtualvoid f(){cout << "B::f()" << endl;}virtualvoid Bf(){cout << "B::Bf()" << endl;}
private:int _ib;char _cb;
};

B内存布局图:size = 12
虚函数指针(4B)
int型数据成员(4B)
char型数据成员(4B,3B用于对齐)

1>class B	size(12):
1>	+---
1> 0	| {vfptr}
1> 4	| _ib
1> 8	| _cb
1>  	| <alignment member> (size=3)
1>	+---
1>B::$vftable@:
1>	| &B_meta
1>	|  0
1> 0	| &B::f
1> 1	| &B::Bf
1>B::f this adjustor: 0
1>B::Bf this adjustor: 0

B1

class B1
: virtual public B
{
public:B1(): _ib1(100), _cb1('1'){}B1(int ib, char ic, int ib1, char cb1): B(ib, ic), _ib1(ib1), _cb1(cb1){cout << "B1(int,char,int,char)" << endl;}virtualvoid f(){cout << "B1::f()" << endl;}virtualvoid f1(){cout << "B1::f1()" << endl;}virtualvoid Bf1(){cout << "B1::Bf1()" << endl;}
private:int _ib1;char _cb1;
};

B1内存布局图:size = 32
虚函数指针(4B)
虚基表指针(4B)
int型数据成员(4B)
char型数据成员(4B,3B用于对齐)
vtordisp(4B)
从基类B继承来的12B

1>class B1	size(32):
1>	+---
1> 0	| {vfptr}
1> 4	| {vbptr}
1> 8	| _ib1
1>12	| _cb1
1>  	| <alignment member> (size=3)
1>	+---
1>16	| (vtordisp for vbase B)
1>	+--- (virtual base B)
1>20	| {vfptr}
1>24	| _ib
1>28	| _cb
1>  	| <alignment member> (size=3)
1>	+---
1>B1::$vftable@B1@:
1>	| &B1_meta
1>	|  0
1> 0	| &B1::f1
1> 1	| &B1::Bf1
1>B1::$vbtable@:
1> 0	| -4
1> 1	| 16 (B1d(B1+4)B)
1>B1::$vftable@B@:
1>	| -20
1> 0	| &(vtordisp) B1::f
1> 1	| &B::Bf
1>B1::f this adjustor: 20
1>B1::f1 this adjustor: 0
1>B1::Bf1 this adjustor: 0
1>vbi:	   class  offset o.vbptr  o.vbte fVtorDisp
1>               B      20       4       4 1

B2

class B2: virtual public B
{
public:B2(): _ib2(1000), _cb2('2'){}B2(int ib, char ic, int ib2, char cb2): B(ib, ic), _ib2(ib2), _cb2(cb2){cout << "B2(int,char,int,char)" << endl;}virtualvoid f(){cout << "B2::f()" << endl;}virtualvoid f2(){cout << "B2::f2()" << endl;}virtualvoid Bf2(){cout << "B2::Bf2()" << endl;}
private:int _ib2;char _cb2;
};

B2内存布局图:size = 32
虚函数指针(4B)
虚基表指针(4B)
int型数据成员(4B)
char型数据成员(4B,3B用于对齐)
vtordisp(4B)
从基类B继承来的12B

1>class B2	size(32):
1>	+---
1> 0	| {vfptr}
1> 4	| {vbptr}
1> 8	| _ib2
1>12	| _cb2
1>  	| <alignment member> (size=3)
1>	+---
1>16	| (vtordisp for vbase B)
1>	+--- (virtual base B)
1>20	| {vfptr}
1>24	| _ib
1>28	| _cb
1>  	| <alignment member> (size=3)
1>	+---
1>B2::$vftable@B2@:
1>	| &B2_meta
1>	|  0
1> 0	| &B2::f2
1> 1	| &B2::Bf2
1>B2::$vbtable@:
1> 0	| -4
1> 1	| 16 (B2d(B2+4)B)
1>B2::$vftable@B@:
1>	| -20
1> 0	| &(vtordisp) B2::f
1> 1	| &B::Bf
1>B2::f this adjustor: 20
1>B2::f2 this adjustor: 0
1>B2::Bf2 this adjustor: 0
1>vbi:	   class  offset o.vbptr  o.vbte fVtorDisp
1>               B      20       4       4 1

D

class D: public B1, public B2
{
public:D(): _id(10000), _cd('3'){}D(int ib, char cb, int ib1, char cb1, int ib2, char cb2, int id, char cd): B1(ib, cb, ib1, cb1), B2(ib, cb, ib2, cb2), B(ib, cb), _id(id), _cd(cd){cout << "D(...)" << endl;}virtualvoid f(){cout << "D::f()" << endl;}virtualvoid f1(){cout << "D::f1()" << endl;}virtualvoid f2(){cout << "D::f2()" << endl;}virtualvoid Df(){cout << "D::Df()" << endl;}
private:int _id;char _cd;
};

D内存布局图:size = 56
从基类B1继承的16B
从基类B2继承的16B
int型数据成员(4B)
char型数据成员(4B,3B用于对齐)
vtordisp(4B)
从基类B继承的12B

虚基表指针存储的内容是什么?(以B2的vbptr为例,地址为20)
① 虚基表指针与子类对象首地址的偏移量(-4,子类B2首地址为16)
② 虚基表指针到虚基类部分的偏移量(24,虚基类B首地址为44)

多重继承:
① 每个基类都有自己的虚函数表:B1,B2
② 派生类如果有自己的虚函数,会被加入到第一个虚函数表中:D自己的虚函数Df被加入到B1的虚函数表中
③ 内存布局中,基类的布局按照被声明时的顺序排列:先B1后B2,如果反过来,内存布局会改变,D自己的虚函数会被加入到B2的虚函数表中(可自己实践)
④ 派生类会覆盖基类的虚函数,只有第一个虚函数表中存放的是真实的被覆盖的函数的地址,其它虚函数表中存放的并不是真实的地址,而是一条跳转指令

1>class D	size(56):
1>	+---
1> 0	| +--- (base class B1)
1> 0	| | {vfptr}
1> 4	| | {vbptr}
1> 8	| | _ib1
1>12	| | _cb1
1>  	| | <alignment member> (size=3)
1>	| +---
1>16	| +--- (base class B2)
1>16	| | {vfptr}
1>20	| | {vbptr}
1>24	| | _ib2
1>28	| | _cb2
1>  	| | <alignment member> (size=3)
1>	| +---
1>32	| _id
1>36	| _cd
1>  	| <alignment member> (size=3)
1>	+---
1>40	| (vtordisp for vbase B)
1>	+--- (virtual base B)
1>44	| {vfptr}
1>48	| _ib
1>52	| _cb
1>  	| <alignment member> (size=3)
1>	+---
1>D::$vftable@B1@:
1>	| &D_meta
1>	|  0
1> 0	| &D::f1
1> 1	| &B1::Bf1
1> 2	| &D::Df //将D中的虚函数加在B1虚函数表中?
1>D::$vftable@B2@:
1>	| -16
1> 0	| &D::f2
1> 1	| &B2::Bf2
1>D::$vbtable@B1@:
1> 0	| -4 //虚基表指针与子类对象首地址的偏移量
1> 1	| 40 (Dd(B1+4)B) //虚基表指针到虚基类部分的偏移量
1>D::$vbtable@B2@:
1> 0	| -4
1> 1	| 24 (Dd(B2+4)B)
1>D::$vftable@B@:
1>	| -44
1> 0	| &(vtordisp) D::f
1> 1	| &B::Bf
1>D::f this adjustor: 44
1>D::f1 this adjustor: 0
1>D::f2 this adjustor: 16
1>D::Df this adjustor: 0
1>vbi:	   class  offset o.vbptr  o.vbte fVtorDisp
1>               B      44       4       4 1

相关文章:

C++虚继承内存布局

C菱形继承内存布局 编译器&#xff1a;Visual Studio 2019 关于如何查看内存布局 B class B { public:B(): _ib(10), _cb(B){cout << "B()" << endl;}B(int ib, char cb): _ib(ib), _cb(cb){cout << "B(int,char)" << endl;}vi…...

IO模型--从BIO、NIO、AIO到内核select、poll、epoll剖析

IO基本概述 IO的分类 IO以不同的维度划分&#xff0c;可以被分为多种类型&#xff1b;从工作层面划分成磁盘IO&#xff08;本地IO&#xff09;和网络IO&#xff1b; 也从工作模式上划分&#xff1a;BIO、NIO、AIO&#xff1b;从工作性质上分为阻塞式IO与非阻塞式IO&#xff1b…...

Zebec完成BNB Chain以及Near链上协议部署,多链化进程加速

从去年开始&#xff0c;Zebec 就开始以多链的形式来拓展自身的流支付生态&#xff0c;一方面向更多的区块链系统拓展自身流支付协议&#xff0c;即从Solana上向EVM链上对协议与通证等进行迁移与拓展。目前基本完成了在BNB Chain以及Near上的合约部署&#xff0c;且能够在这些EV…...

wpscan常见的使用方法

目录 简单介绍 暴力破解 信息收集 指定用户爆破 命令集合 简单介绍 Wordpress是一个以PHP和MySQL为平台的免费自由开源的博客软件和内容管理系统。 WPScan是Kali Linux默认自带的一款漏洞扫描工具&#xff0c;它采用Ruby编写&#xff0c;能够扫描WordPress网站中的多种安…...

Tree 底层源码实现(二叉树、递归、迭代)

树&#xff08;Tree&#xff09;是一种非线性数据结构&#xff0c;由一组节点和它们之间的边组成。在树中&#xff0c;每个节点都有零个或多个子节点&#xff0c;除了根节点外&#xff0c;每个节点都有且仅有一个父节点。树可以被用于许多应用程序&#xff0c;如文件系统、XML文…...

家政服务小程序实战教程13-接入客服

小程序在微信里使用&#xff0c;以其无需安装随用随走为特点。但是有个问题是&#xff0c;如果提供商品或者服务的&#xff0c;用户如果有问题往往希望平台的运营方给出专业的解答。为了满足这类需求&#xff0c;就需要我们提供客服接入的功能&#xff0c;用户可以点击客服图标…...

大白话高并发(三)

背景 高并发得第三篇&#xff0c;讲一讲压测吧&#xff0c;因为我的目的是模拟100万人同时来秒杀。 是不是真的要找100万个人 没必要 &#xff0c;你就算100万人掐着表在同一毫秒内把请求请求某一台机器&#xff0c;服务器也不可能在同一时间处理那么多请求&#xff0c;因为…...

vue全家桶(四)前端工程化

vue全家桶&#xff08;四&#xff09;前端工程化1.模块化的相关规范1.1模块化概述1.2模块化的分类A.浏览器端的模块化B.服务器端的模块化C.ES6模块化1.2.1 Node.js中通过bable体验ES6模块化1.2.2 ES6模块化的基本语法1.2.2.1 默认导出与默认导入1.2.2.2 按需导出与按需导入1.2.…...

超螺旋滑模控制(STA)

超螺旋滑模控制(Super Twisting Algorithm, STA) 超螺旋滑模控制又称超扭滑模控制&#xff0c;可以说是二阶系统中最好用的滑模控制方法。 系统模型 对于二阶系统可以建立具有标准柯西形式的微分方程组 {x˙1x2x˙2fg⋅u\begin{cases} \dot x_1 x_2 \\ \dot x_2 f g \cdo…...

NX二次开发编译时dll自动数字签名及拷贝

前言 在UG5.0开始&#xff0c;所有基于UG二次开发的DLL都要“签名”后才能被客户端上正版的NX调用。 一、基于C# 开发签名 1、添加资源文件 &#xff08;1&#xff09;项目类库上右键–>属性–>资源–>添加资源右边小三角–>添加现有文件–>切换到UG安装目录下…...

教你如何搭建人事OA-薪资管理系统,demo可分享

1、简介1.1、案例简介本文将介绍&#xff0c;如何搭建人事OA-薪资管理。1.2、应用场景根据设置薪资基础及考勤和绩效的数据计算得到各个员工工资详情。2、设置方法2.1、表单搭建1&#xff09;新建表单【工资表】&#xff0c;字段设置如下&#xff1b;名称类型名称类型人员资料分…...

ChIP-seq 分析:Mapped 数据可视化(4)

1. Mapped reads 现在我们有了 BAM 文件的索引&#xff0c;我们可以使用 idxstatsBam() 函数检索和绘制映射读取的数量。 mappedReads <- idxstatsBam("SR_Myc_Mel_rep1.bam")TotalMapped <- sum(mappedReads[, "mapped"])ggplot(mappedReads, aes(x…...

Jenkins 基于Kubernetes 弹性构建池

流程&#xff1a;创建Jenkins Agent&#xff1b;获取Jenkins Agent的参数&#xff1b;渲染yaml模板&#xff1b;调用K8s API在固定的NS中创建一个Pod&#xff1b;运行Jenkins pipeline到agent&#xff1b;创建Agentimport hudson.model.Node.Mode import hudson.slaves.* impor…...

经典算法题---链表奇偶重排(好题)双指针系列

我听别人说这世界上有一种鸟是没有脚的&#xff0c;它只能够一直的飞呀飞呀&#xff0c;飞累了就在风里面睡觉&#xff0c;这种鸟一辈子只能下地一次&#xff0c;那一次就是它死亡的时候。——《阿甘正传》这一文章讲解链表的奇偶排序问题&#xff0c;这是一道不难但是挺好的链…...

数据仓库实战

目录1、最佳实战1.1 表的分类1.2 ETL策略1.3 任务调度2、项目实战2.1 项目概述2.2 数据描述2.3 架构设计2.4 环境搭建2.5 项目开发1、最佳实战 1.1 表的分类 维度建模中表的类型&#xff1a;事实表和维度表 事实表又可以分为&#xff1a;事务事实表、周期快照事实表、累积快照…...

GPT系列:GPT, GPT-2, GPT-3精简总结 (模型结构+训练范式+实验)

&#x1f604; 花一个小时快速跟着 人生导师-李沐 过了一遍GPT, GPT-2, GPT-3。下面精简地总结了GPT系列的模型结构训练范式实验。 文章目录1、GPT1.1、模型结构&#xff1a;1.2、范式&#xff1a;预训练 finetune1.3、实验部分:2、GPT-22.1、模型结构2.2、范式&#xff1a;预…...

ASE12N65SE-ASEMI高压MOS管ASE12N65SE

编辑-Z ASE12N65SE在ITO-220AB封装里的静态漏极源导通电阻&#xff08;RDS(ON)&#xff09;为0.68Ω&#xff0c;是一款N沟道高压MOS管。ASE12N65SE的最大脉冲正向电流ISM为48A&#xff0c;零栅极电压漏极电流(IDSS)为10uA&#xff0c;其工作时耐温度范围为-55~150摄氏度。ASE…...

centos8防火墙命令配置(开放端口)

查看防火墙状态&#xff1a;&#xff08;root用户&#xff09;firewall-cmd –state启动防火墙&#xff1a;&#xff08;root用户&#xff09;systemctl start firewalld.service查看防火墙开放端口&#xff1a;&#xff08;root用户&#xff09; firewall-cmd --list-ports …...

Instagram营销教程_编程入门自学教程_菜鸟教程-免费教程分享

教程简介 Instagram营销初学者教程 - 从简单和简单的步骤学习Instagram营销从基本到高级概念&#xff0c;包括概述&#xff0c;业务战略&#xff0c;安装和注册&#xff0c;发布和参与&#xff0c;活动审查&#xff0c;微调内容&#xff0c;营销工具和应用程序&#xff0c;集成…...

HTTP Code含义

HTTP Code描述详细100继续100&#xff08;继续&#xff09;状态代码表示一个已收到请求&#xff0c;尚未被拒绝服务器。服务器打算在请求已完全收到并已采取行动。当请求包含 Expect 标头字段时100-continue expectation&#xff0c;100响应表示服务器希望接收请求有效负载主体…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...