C++核心机制-this 指针传递与内存布局分析
示例代码
#include<iostream>
using namespace std;class A {
public:int a;A() {printf("A:A()的this指针:%p!\n", this);}void funcA() {printf("A:funcA()的this指针:%p!\n", this);}
};class B {
public:int b;B() {printf("B:B()的this指针:%p!\n", this);}void funcB() {printf("B:funcB()的this指针:%p!\n", this);}
};class C : public A, public B {
public:int c;C() {printf("C:C()的this指针:%p!\n", this);}void funcC() {printf("C:funcC()的this指针:%p!\n", this);}
};int main() {cout << sizeof(A) << endl;cout << sizeof(B) << endl;cout << sizeof(C) << endl;C myc;myc.funcA();myc.funcB();myc.funcC();return 0;
}
输出分析
4
4
12
A:A()的this指针:00000059A22FF968!
B:B()的this指针:00000059A22FF96C!
C:C()的this指针:00000059A22FF968!
A:funcA()的this指针:00000059A22FF968!
B:funcB()的this指针:00000059A22FF96C!
C:funcC()的this指针:00000059A22FF968!
问题 1:A、B、C 三个对象的内存是如何分布的?
在 class C : public A, public B
中,C 同时继承自 A 和 B,A 是第一个基类,B 是第二个基类。它们在内存中是顺序排列的。
问题 2:如果 C 重载了其父类的方法,传递的 this
是 C 还是父类的?
情况一:没有重载
当 C
没有重写(覆盖)父类的方法时,比如调用 myc.funcB()
:
- 实际调用的是
B::funcB()
。 this
指针会调整为 B 子对象的地址。- 所以
this
!=C
对象起始地址,而是偏移后的地址。
情况二:C 重载了父类的方法
如果你在 C
中重写了 funcB()
:
void funcB() {printf("C中重写的funcB()的this指针:%p!\n", this);
}
那么:
myc.funcB()
实际调用的是C::funcB()
。this
是C
对象的起始地址(与A
的起始地址一致)。
总结与补充
内存布局结论
- 在多继承中,派生类对象会顺序排列所有基类子对象的内存布局。
this
指针在非虚继承中只是指向当前类子对象的地址。- 如果基类函数没有被覆盖,调用时
this
指针会偏移到对应子对象。 - 如果被覆盖,则
this
是派生类的完整对象地址。
sizeof
的输出说明
sizeof(A) == 4 // int a
sizeof(B) == 4 // int b
sizeof(C) == 12 // A(4) + B(4) + C::c(4)
补充说明:为什么 A 和 C 的 this 是一样的?
因为 A 是 C 的第一个基类,所以在内存中,A 的子对象从 C 的起始地址开始,C 的 this 指针 == A 的 this 指针。
但是 B 的子对象是紧跟在 A 后面,所有其 this 指针是偏移了一个 int
(4 字节)后的地址。
相关文章:
C++核心机制-this 指针传递与内存布局分析
示例代码 #include<iostream> using namespace std;class A { public:int a;A() {printf("A:A()的this指针:%p!\n", this);}void funcA() {printf("A:funcA()的this指针:%p!\n", this);} };class B { public:int b;B() {prin…...
python asyncio 的基本使用
1、引言 asyncio 是 Python 标准库中的一个库,提供了对异步 I/O 、事件循环、协程和任务等异步编程模型的支持。 asyncio 文档 2、进程、线程、协程 线程 线程是操作系统调度的基本单位,同一个进程中的多个线程共享相同的内存空间。线程之间的切换由操…...
大模型中提到的分词器是什么
分词器在大模型中的核心解析 1. 分词器的定义与基本作用 分词器(Tokenizer)是自然语言处理(NLP)中的核心组件,负责将原始文本拆分为模型可处理的离散单元(称为Token)。其核心功能包括: 文本离散化:将连续字符序列转化为数字序列,作为模型的输入。语义单元提取:通过…...
Android中使用BuildConfig.DEBUG无法找到的解决方法
BuildConfig是Android构建工具自动生成的一个类,通常位于应用的包名下,包含一些构建相关的常量,比如DEBUG标志、应用ID、版本信息等。 遇到的问题可能有几种情况。首先,可能项目没有正确构建,导致BuildConfig没有被生…...
Python(14)Python内置函数完全指南:从基础使用到高阶技巧
目录 背景介绍一、内置函数全景分类1. 数据类型转换(15个)2. 数学运算(12个)3. 迭代处理(9个)4. 对象操作(11个)5. 输入输出(4个) 二、高阶函数应用场景1. en…...
echo命令,tail命令,反引号,重定向符
echo命令: 作用:在命令行中输出指定的内容,相当于print语句 语法:echo 指定的内容(当内容包含空格和特殊字符的时候,语句很复杂的时候,最好用双引号括起来) tail命令:…...
集成学习介绍
集成学习(Ensemble Learning)是一种机器学习范式,它通过组合多个模型的预测来提高整体模型的性能。单一模型可能在某些方面表现不佳或具有较高的偏差或方差,而集成方法能够通过结合多个模型的优点来克服这些问题,从而提…...
【CUDA】ubuntu环境下安装cuda
写在前面 软硬件匹配问题 :如老显卡安装ubuntu24, 会发现适合显卡的cuda不适合ubuntu24, 适合ubuntu24的cuda不适合显卡,因此安装ubuntu系统前,务必查明 :当前设备的显卡支持的cuda,支持哪些ubuntu版本 下面的三个问题…...
进程间通信-信号量
消息队列(Message Queue)是一种在不同组件或进程间进行异步通信的机制,它允许应用程序以松耦合的方式交换消息。消息队列就像一个缓冲区,发送者将消息放入队列,接收者从队列中取出消息进行处理。以下为你详细介绍消息队…...
Ubuntu 22.04安装MySQL : Qwen2.5 模型对话数据收集与微调教程
在Ubuntu 22.04安装MySQL的教程请点击下方链接进行参考: 点击这里获取MySQL安装教程 今天将为大家带来如何微调Qwen2.5模型并连接数据库进行对话的教程。快跟着小编一起试试吧~ 1 大模型 Qwen2.5 微调步骤 1.1 从 github 仓库 克隆项目 克隆存储库:#拉取代码 git clo…...
L1-8 新年烟花
单位 杭州百腾教育科技有限公司 新年来临,许多地方会举行烟花庆典庆祝。小 C 也想参加庆典,但不幸的是跟他一个想法的人实在太多,活动场地全是人人人人人人人人人…… 活动场地可视作一个 NM 的矩阵,其中有一些格子是空的&#…...
OpenCV中的轮廓检测方法详解
文章目录 引言一、什么是轮廓?二、OpenCV中的轮廓检测基础1. 基本步骤2. findContours函数详解 三、轮廓检索模式四、轮廓近似方法五、轮廓特征分析1. 轮廓面积2. 轮廓周长/弧长3. 轮廓近似(多边形拟合)4. 凸包5. 边界矩形6. 最小闭合圆7. 拟…...
AIP-231 批量方法:Get
编号231原文链接AIP-231: Batch methods: Get状态批准创建日期2019-06-18更新日期2019-06-18 一些API允许用户获取一组特定资源在一个时间点(例如使用读事务)的状态。批量获取方法提供了这个功能。 指南 API 可以 按照以下模式支持批量获取࿱…...
人工智能基础-matplotlib基础
绘制图形 import numpy as np x np.linspace(0, 10, 100) y np.sin(x) import matplotlib as mpl import matplotlib.pyplot as plt plt.plot(x, y) plt.show()绘制多条曲线 siny y.copy() cosy np.cos(x) plt.plot(x, siny) plt.plot(x, cosy) plt.show()设置线条颜色 …...
qt运行时报段错误
标题: qt运行时报段错误,查看stack,显示: 原因 报错的cpp文件新包含一个头文件,这个头文件里的pack指令有问题,如下: 解决办法 修改为正确的pack指令。...
【Qt】Qt Creator开发基础:项目创建、界面解析与核心概念入门
🍑个人主页:Jupiter. 🚀 所属专栏:QT 欢迎大家点赞收藏评论😊 目录 Qt Creator 新建项⽬认识 Qt Creator 界⾯项⽬⽂件解析Qt 编程注意事项认识对象模型(对象树)Qt 窗⼝坐标体系 Qt Creator 新…...
CAP应用
1.工作原理 CAP(Consistent,Available,Partition - tolerant)框架在.NET 中的工作原理。CAP 是一个用于.NET 的分布式事务解决方案,主要用于实现微服务架构中的数据一致性(实现分布式事务的最终一致性&…...
典型操作系统内核架构
在典型操作系统架构(如下图所示)中,内核负责以安全、公平的方式为多个应用程序管理和共享硬件资源。 内核通过一组 API(即系统调用)向应用程序提供服务。这些 API 不同于常规库函数,因其是用户模式到内核模…...
AWS Redshift的使用场景及一些常见问题
Redshift 不是关系型数据库, 提供了Amazon Redshift Serverless 和 Amazon Redshift 都是构建于 Redshift 数仓引擎之上的,但它们适用的场景不同。Redshift和Dynamodb都可以存储数据, 分别怎么选择? 这里记录一些常见的问题和场景。 1. 如何选择用Amazon Redshift…...
**searchProperties 是什么,python中**是什么:解包字典的操作符
searchProperties 是什么,python中是什么:解包字典的操作符 在 Python 中,** 是用于解包字典的操作符,**searchProperties 是一个可变关键字参数。它允许函数接受任意数量的关键字参数,这些参数会被收集到一个字典中,字典的键是参数名,值是参数对应的值。 在 ButtonCon…...
.NET MCP 文档
MCP 概述 MCP(Model Context Protocol)是由 Anthropic 推出的一种开放协议,类似 AI 的 USB-C 扩展坞,用于在大模型和数据源之间建立安全的通信(授权),让 AI 应用能够安全地访问和操作本地或远程…...
07软件测试需求分析案例-修改用户信息
修改用户信息是后台管理菜单的一个功能模块,只有admin才有修改权限。包括查询用户名进行显示用户相关信息,并且修改用户相关信息的功能。 1.1 通读文档 通读需求规格说明书是提取信息,提出问题,输出具有逻辑、规则、流程的业务…...
第九届“创客中国”中小企业创新创业大赛总决赛企业组三等奖项目—基于AI智能代码疫苗技术的数字供应链安全解决方案
项目名称:基于AI智能代码疫苗技术的数字供应链安全解决方案 企业名称:北京安普诺信息技术有限公司(悬镜安全) 项目简介: 基于AI智能代码疫苗技术的数字供应链安全解决方案,悬镜安全在全球范围内首创…...
企业级RAG行业应用落地方案——阿里云百炼
行业痛点分析 这张图主要围绕“行业痛点锚定”展开,通过雷达图和表格结合的方式,分析电商选品在不同维度下的情况: 分析对象:聚焦电商选品。维度展示:从可结构化程度、重复性、数据可得性、人机互动性、AI带来的价值这…...
Mac切换node版本
Mac切换node版本 1.首先安装n模块: sudo npm install -g n 2.升级node.js到最新稳定版 sudo n stable 3.升级到最新版 sudo n latest 4.n后面也可以跟随版本号,升级到任意版本 sudo n v0.10.26或sudo n 0.10.26 5.切换使用版本 sudo n 7.10.0 6.删除制定版本…...
从零开始学A2A一:A2A 协议概述与核心概念
A2A 协议概述与核心概念 学习目标 基础理解 掌握A2A协议的基本概念和背景理解协议的设计原则和核心思想了解协议在AI领域的重要性 技术掌握 熟悉A2A协议的核心功能组件掌握能力发现和任务管理机制理解多模态交互和安全通信原则 实践应用 能够设计基于A2A的智能体系统掌握协议…...
科普:如何通过ROC曲线,确定二分类的“理论阈值”
在二分类问题中,已知预测概率(如逻辑回归、神经网络输出的概率值)时,阈值的选择直接影响分类结果(正/负样本判定)。 一、实践中的阈值选择方法 1. 基于业务目标的调整 最大化准确率:适用于样…...
Cherry Studio + MCP,从0到1保姆教程,3个场景体验
📺 详细操作以视频方式呈现,视频地址周五会更新出来 💯 鉴于很多观众网络环境受限,文末提供所需安装文件网盘分享 💬 什么是 MCP ? MCP(Model Context Protocol,MCP)模型…...
Docker学习笔记-docker安装、删除
一、在centOS 7中docker的默认安装目录 # Docker 主配置文件目录 ls /etc/docker# Docker 数据目录(镜像、容器、卷等) ls /var/lib/docker# Docker 可执行文件路径 which docker # 输出类似 /usr/bin/docker 二、docker文件目录说明 目录/文件用途/…...
visual studio 常用的快捷键(已经熟悉的就不记录了)
以下是 Visual Studio 中最常用的快捷键分类整理,涵盖代码编辑、调试、导航等核心场景: 一、生成与编译 生成解决方案 Ctrl Shift B 一键编译整个解决方案,检查编译错误(最核心的生成操作)编译当前文件 Ctrl F…...
使用人工智能大模型腾讯元宝,如何做课题研究?
今天我们学习使用人工智能大模型腾讯元宝,如何做课题研究? 手把手学习视频地址:https://edu.csdn.net/learn/40402/666424 在腾讯元宝对话框中输入如何协助老师做课题(申报书、开题报告、中期报告、结题报告)&#x…...
开源模型应用落地-模型上下文协议(MCP)-第三方MCP Server实战指南(五)
一、前言 在AI技术高速发展的2025年,如何让大语言模型(LLM)更灵活地调用外部工具与数据,成为开发者关注的焦点。模型上下文协议(MCP)作为AI与外部资源的“万能接口”,通过标准化交互框架解决了传统集成中的碎片化问题。而第三方MCP Server的引入,进一步降低了开发门…...
python每日一练
题目一 输入10个整数,输出其中不同的数,即如果一个数出现了多次,只输出一次(要求按照每一个不同的数第一次出现的顺序输出)。 解题 错误题解 a list(map(int,input().split())) b [] b.append(a[i]) for i in range(2,11):if a[i] not in b:b.append(a[i]) print(b)但是会…...
跨境贸易之常见的贸易术语
外贸出口中经常会听到FOB、CIF、DDP各种术语,这些都是什么意思呢? 今天我们来介绍一下他们的确切含义。一般来说你听到的这些话语都是表示交货的方式。 如果普通的贸易过程大家一听就明白的,就是货到付款,款到发货,支…...
KingbaseES之KDts迁移SQLServer
项目适配迁移SQLServer至金仓,今天写写KDts-WEB版迁移工具迁移SQLServer至KingbaseES的步骤,以及迁移注意事项. SQLServer版本:SQLServer2012 KingbaseES版本:V009R004C011(SQLServer兼容版) --1.进入数据库客户端工具KDTS工具目录,启动KDts服务: [king…...
Rust编程学习(一): 变量与数据类型
我们先从Rust基本的变量声明定义与数据类型开始学习,了解这门语言基本特性。 1 变量与可变性 变量声明 变量声明以let关键字开头,x为变量名,变量名后紧跟冒号和数据类型,但是rust编译器有自动推导变量类型的功能,可以省略显式的声…...
Java 在人工智能领域的突围:从企业级架构到边缘计算的技术革新
一、Java AI 的底层逻辑:从语言特性到生态重构 在 Python 占据 AI 开发主导地位的当下,Java 正通过技术重构实现突围。作为拥有 30 年企业级开发经验的编程语言,Java 的核心优势在于强类型安全、内存管理能力和分布式系统支持,这…...
[极客大挑战 2019]HardSQL1
打开网页,貌似存在SLQ注入,尝试闭合单引号 才生报错信息,但是尝试联合注入 不出意外应该是被过滤了,没法使用,可以考虑一下报错注入 这里可以使用字典爆破一下,利用页面返回情况,看看哪些关键词…...
深入剖析C++中 String 类的模拟实现
目录 引言 一、基础框架搭建 成员变量与基本构造函数 析构函数 二、拷贝与赋值操作 深拷贝的拷贝构造函数 赋值运算符重载 三、字符串操作功能实现 获取字符串长度 字符串拼接 字符串比较 字符访问 四、迭代器相关实现(简单模拟) 迭代器类型…...
KWDB创作者计划— KWDB技术范式革命:从数据存储到认知进化的架构跃迁
引言:数据库的认知觉醒 在AIoT设备数量突破万亿、边缘计算节点算力总和超越云端的2025年,传统数据库的"存储-计算"二元结构正面临认知维度缺失的困境。当工业数字孪生需要实时推演百万设备状态,城市大脑需处理多模态时空数据时&…...
【后端开发】Spring配置文件
文章目录 配置文件properties配置文件基本语法读取配置文件 yml配置文件基本语法读取配置文件配置空字符串及null单双引号配置对象配置集合配置Map 优缺点优点缺点 配置文件 硬编码是将数据直接嵌入到程序或其他可执行对象的源代码中,也就是常说的"代码写死&q…...
探讨HMI(人机界面)设计原则,如何通过优秀的设计提升操作效率和用户体验
在物联网与人工智能深度渗透的今天,人机界面(Human-Machine Interface, HMI)已成为连接数字世界与物理世界的神经末梢。优秀的HMI设计不仅关乎视觉美感,更是认知工程、信息架构与交互范式的协同创新。本文从神经认知科学原理出发&…...
网络7 配置网卡 路由表
我配置了两张网卡,一个是仅主机模式,一个是NAT模式。刚才NAT模式动态配置下,ping百度ping的通,路由表中只显示NAT的网关。我把NAT模式修改为静态IP,路由表中显示仅主机模式的网关和NAT模式的网关,ping百度ping不通了 …...
InnoDB的MVCC实现原理?MVCC如何实现不同事务隔离级别?MVCC优缺点?
概念 InnoDB的MVCC(Multi-Version Concurrency Control)即多版本并发控制,是一种用于处理并发事务的机制。它通过保存数据在不同时间点的多个版本,让不同事务在同一时刻可以看到不同版本的数据,以此来减少锁竞争&…...
同构应用开发
以下是关于 同构应用(Isomorphic/Universal Application)开发 的系统知识梳理,涵盖核心概念、技术实现、性能优化及工程实践,帮助我们全面掌握这一现代Web开发范式: 一、同构应用核心概念 1. 定义与价值 定义:同一套代码在服务端(Node.js)和客户端(浏览器)运行,实现…...
如何制定有效的风险应对计划
制定有效的风险应对计划的核心在于: 识别潜在风险、评估风险的影响与概率、选择合适的应对策略、建立动态监控和反馈机制。 其中,识别潜在风险是最为关键的第一步。只有准确识别出可能的风险,才能在后续的评估、应对、监控等环节中做到有的放…...
使用wpa_cli和wpa_supplicant配置Liunx开发板的wlan0无线网
目录 1 简单介绍下wpa_cli和wpa_supplicant 1.1 wpa_supplicant 简介 1.2 wpa_cli 简介 1.3 它们之间的关系 2 启动wpa_supplicant 3 使用rz工具把wpa_cli命令上传到开发板 4 用wpa_cli配置网络 参考文献: 1 简单介绍下wpa_cli和wpa_supplicant 1.1 wpa_su…...
深度学习模型的概述与应用
📌 友情提示: 本文内容由银河易创AI(https://ai.eaigx.com)创作平台的gpt-4-turbo模型生成,旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证,建议读者通过官方文档或实践进一步确认其准…...
基于Ubuntu系统搭建51单片机开发环境的详细教程
一、环境搭建 1. 安装SDCC编译器 SDCC(Small Device C Compiler)是Linux下常用的开源51单片机编译器,支持多种芯片架构。 安装命令: sudo apt update sudo apt install sdcc 验证安装:输入 sdcc -v,若显…...
通义灵码助力Neo4J开发:快速上手与智能编码技巧
在 Web 应用开发中,Neo4J 作为一种图数据库,用于存储节点及节点间的关系。当图结构复杂化时,关系型数据库的查找效率会显著降低,甚至无法有效查找,这时 Neo4J 的优势便凸显出来。然而,由于其独特的应用场景…...