C++ 虚函数:深入理解多态的核心机制
C++ 虚函数:深入理解多态的核心机制
在 C++ 里,虚函数是实现 多态(Polymorphism) 的关键机制之一。透彻理解虚函数的概念、实现方式以及使用场景,对编写高效且可扩展的 C++ 代码起着至关重要的作用。本文会详细介绍 C++ 虚函数的所有知识点,并结合实例辅助理解。
1. 虚函数基础概念
1.1 什么是虚函数
虚函数是在基类中声明,并且能在派生类里被重写(override)的成员函数。它允许利用基类指针或引用调用派生类的函数,从而实现 运行时多态(Run - time Polymorphism)。
#include <iostream>
using namespace std;class Base {
public:virtual void show() { cout << "Base class show()" << endl; }
};class Derived : public Base {
public:void show() override { cout << "Derived class show()" << endl; }
};int main() {Base* ptr = new Derived();ptr->show(); // 输出:Derived class show()delete ptr;return 0;
}
要是 show()
并非虚函数,那么 ptr->show()
就会调用 Base::show()
,而非 Derived::show()
。
1.2 静态绑定 vs 动态绑定
在深入了解虚函数之前,得先明白 C++ 的两种绑定机制:
- 静态绑定(早绑定):在编译期确定函数调用地址。适用于普通成员函数、全局函数,效率高但缺乏灵活性。
- 动态绑定(晚绑定):在运行时依据对象类型确定函数调用。通过虚函数实现,牺牲少量效率来换取扩展性。
class Shape {
public:void draw() { /* 静态绑定 */ } // 非虚函数virtual void rotate() { /*...*/ } // 虚函数(动态绑定)
};
1.3 虚函数的本质
虚函数是 C++ 实现运行时多态的核心机制。当运用基类指针/引用操作派生类对象时,虚函数允许调用实际对象类型的函数版本。
Shape* p = new Circle();
p->rotate(); // 调用Circle::rotate()
2. 虚函数的工作原理
2.1 虚函数表(VTable)和虚函数指针(VPointer)
C++ 借助 虚函数表(Virtual Table, VTable) 和 虚函数指针(Virtual Pointer, VPointer) 来达成虚函数的动态绑定。
- 虚函数表(VTable):类级别的结构,每个包含虚函数的类都有一个 VTable,用于存储该类的虚函数指针。
- 虚函数指针(VPointer, VPTR):对象级别的指针,每个对象都有一个 VPTR,指向该类的 VTable。
在运行时,调用虚函数时,会通过 VPTR 查找 VTable,然后调用对应的函数。
示例:
class Base {
public:virtual void show() {} // 虚函数
};class Derived : public Base {
public:void show() override {}
};
在编译后的内存布局可能如下:
Base 对象:
[ VPTR ] --> 指向 Base 的 VTableDerived 对象:
[ VPTR ] --> 指向 Derived 的 VTableBase 的 VTable:
[ show() -> Base::show() ]Derived 的 VTable:
[ show() -> Derived::show() ]
2.2 虚函数表(VTable)深度解析
每个包含虚函数的类在编译时都会生成虚函数表:
- VTable 结构:
|-----------------------|
| 类型信息(RTTI)指针 | // C++标准不强制要求
|-----------------------|
| virtual func1 的地址 |
|-----------------------|
| virtual func2 的地址 |
|-----------------------|
| ... |
- 单继承时的内存布局:
class Base {int x;virtual void vfunc1();
};class Derived : public Base {int y;void vfunc1() override;
};
内存布局:
Derived 对象:
+---------------+
| vptr | --> Derived VTable
+---------------+
| Base::x |
+---------------+
| Derived::y |
+---------------+
2.3 多重继承下的虚函数
多重继承时,每个基类都有自己的 vptr:
class Base1 { virtual void f1(); };
class Base2 { virtual void f2(); };
class Derived : public Base1, public Base2 {void f1() override;void f2() override;
};
内存布局:
Derived 对象:
+---------------+
| Base1 vptr | --> Derived's Base1 VTable
+---------------+
| Base1 data |
+---------------+
| Base2 vptr | --> Derived's Base2 VTable
+---------------+
| Base2 data |
+---------------+
| Derived data |
+---------------+
2.4 虚函数指针(vptr)的初始化过程
vptr 的初始化发生在对象构造过程中:
- 对象内存分配
- 基类构造函数调用
- 设置当前类的 vptr
- 成员变量初始化
- 派生类构造函数执行
这就解释了为何构造函数不能是虚函数——在基类构造函数执行时,派生类的 vptr 尚未初始化。
3. 关键知识点
3.1 虚函数只能用于非静态成员函数
静态成员函数没有 this
指针,不依赖对象,所以无法成为虚函数。
3.2 析构函数必须为虚函数
如果一个类有虚函数,建议把 基类的析构函数声明为虚函数,不然可能会导致内存泄漏。
class Base {
public:virtual ~Base() { cout << "Base Destructor" << endl; }
};class Derived : public Base {
public:~Derived() { cout << "Derived Destructor" << endl; }
};int main() {Base* ptr = new Derived();delete ptr; // 先调用 Derived 析构函数,再调用 Base 析构函数return 0;
}
如果 Base::~Base()
不是虚函数,delete ptr;
只会调用 Base
的析构函数,Derived
的析构函数不会执行,从而导致 内存泄漏。
虚析构函数的必要性可以通过以下代码验证:
class Base {
public:// 非虚析构函数~Base() { cout << "Base destroyed\n"; }
};class Derived : public Base {int* data;
public:Derived() { data = new int[100]; }~Derived() { delete[] data; cout << "Derived destroyed\n"; }
};int main() {Base* p = new Derived();delete p; // 仅调用Base的析构函数!return 0;
}
当基类析构函数为虚函数时,调用顺序:
Derived destructor -> Base destructor
3.3 纯虚函数与抽象类
纯虚函数(Pure Virtual Function) 是没有具体实现的虚函数,需要在派生类中实现。
class Base {
public:virtual void show() = 0; // 纯虚函数
};class Derived : public Base {
public:void show() override { cout << "Derived class show()" << endl; }
};
包含 至少一个纯虚函数的类 叫做 抽象类(Abstract Class),不能实例化。纯虚函数也可以提供实现(C++ 特性):
class AbstractClass {
public:virtual void pureVirtual() = 0;
};// 仍然可以提供实现(C++特性)
void AbstractClass::pureVirtual() {cout << "Default implementation\n";
}class Concrete : public AbstractClass {
public:void pureVirtual() override {AbstractClass::pureVirtual(); // 调用基类实现cout << "Custom implementation\n";}
};
3.4 final 关键字
C++11 引入 final
关键字,禁止派生类重写某个虚函数。
class Base {
public:virtual void show() final { cout << "Base show()" << endl; }
};class Derived : public Base {
public:// void show() override; // 编译错误!
};
3.5 override 关键字
C++11 引入 override
关键字,强制派生类必须正确覆盖基类的虚函数。
class Base {
public:virtual void show() {}
};class Derived : public Base {
public:void show() override {} // 编译器检查是否正确覆盖
};
3.6 虚函数性能分析
虚函数调用开销主要源于:
- 间接寻址(通过 vptr 访问 vtable)
- 指令缓存不友好(函数地址不连续)
- 无法内联优化(多数情况下)
通过 Godbolt 编译器资源管理器观察汇编代码差异:
// 普通函数调用
mov eax, DWORD PTR [obj]
call eax// 虚函数调用
mov rax, QWORD PTR [obj] // 获取vptr
mov rax, QWORD PTR [rax] // 获取vtable地址
call QWORD PTR [rax] // 调用第一个虚函数
4. 常见问题
4.1 为什么虚函数的调用比普通函数慢?
虚函数需要通过 VPTR 查找 VTable,增加了一次间接寻址的开销。
4.2 如何禁用类的虚函数表?
如果类中没有虚函数,编译器不会为其生成 VTable。
4.3 为什么构造函数不能是虚函数?
构造函数在对象创建时调用,而虚函数依赖 VTable,而 VTable 在构造函数执行时可能尚未初始化,因此构造函数不能是虚函数。
5. 总结
知识点 | 说明 |
---|---|
虚函数 | 通过 virtual 关键字定义,可在派生类中重写 |
运行时多态 | 使用基类指针/引用调用派生类的函数 |
VTable & VPTR | C++ 通过 VTable 和 VPTR 实现虚函数 |
纯虚函数 | = 0 语法,定义抽象类 |
析构函数 | 必须是虚函数,防止内存泄漏 |
final | 禁止派生类重写虚函数 |
override | 确保正确覆盖基类的虚函数 |
虚函数是 C++ 多态性的重要特性,掌握其原理和应用能帮助我们编写高效、可扩展的 C++ 程序。
相关文章:
C++ 虚函数:深入理解多态的核心机制
C 虚函数:深入理解多态的核心机制 在 C 里,虚函数是实现 多态(Polymorphism) 的关键机制之一。透彻理解虚函数的概念、实现方式以及使用场景,对编写高效且可扩展的 C 代码起着至关重要的作用。本文会详细介绍 C 虚函数…...
速盾:高防CDN节点对收录有影响吗?
引言 搜索引擎收录是网站运营中至关重要的环节,它直接影响着网站的曝光度和流量。近年来,随着网络安全威胁的增加,许多企业开始采用高防CDN(内容分发网络)来保护其网站免受DDoS攻击和其他形式的网络攻击。然而&#x…...
按规则批量修改文件扩展名、删除扩展名或添加扩展名
文件的扩展名是多种多样的,有些不同文件的扩展名之间相互是可以直接转换的。我们工作当中最常见的就是 doc 与 docx、xls 与 xlsx、jpg 与 jpeg、html 与 htm 等等,这些格式在大部分场景下都是可以相互转换 能直接兼容的。我们今天要介绍的就是如何按照一…...
在Java项目中,引入【全局异常处理器】
目录 一.为什么引入全局异常处理器(目前项目碰到了什么问题)? 1.问题描述 2.与预期的差别 3.解决方案 二.解决上述问题 1.定义【业务异常类】 2.在serviceImpl层,手动抛出【违反唯一性约束】这个异常 3.定义【全局异常处理…...
计算机网络-TCP协议详解
TCP协议详解 2. TCP协议详解2.1 TCP协议概述2.1.1 TCP的历史背景2.1.2 TCP的设计目标2.1.3 TCP的基本特性2.1.4 TCP与其他传输协议的比较2.1.5 TCP的应用场景 2.2 TCP头部结构2.2.1 TCP头部格式2.2.2 TCP头部字段详解源端口号和目的端口号(各16位)序列号…...
[蓝桥杯 2023 省 A] 平方差
P9231 [蓝桥杯 2023 省 A] 平方差 题目描述 给定 L , R L,R L,R,问 L ≤ x ≤ R L \leq x \leq R L≤x≤R 中有多少个数 x x x 满足存在整数 y , z y,z y,z 使得 x y 2 − z 2 xy^2-z^2 xy2−z2。 输入格式 输入一行包含两个整数 L , R L,R L,Rÿ…...
隐私通信新时代:磐石云AXB平台如何重塑企业安全防线?
在数据泄露频发的当下,企业如何守护用户隐私?磐石云AXB隐私号平台以四大技术革新,构建通信安全堡垒。 技术突破: 动态号码隔离,隐私0泄露 AXB模式下,A与B的真实号码全程隐藏,仅通过虚拟号X中转…...
什么是八步工作法?
八步工作法,顾名思义,就是把一项工作拆分成八个步骤来完成。它的核心目的是让工作变得更有条理,更高效,避免忙而无序,做到事事有着落,件件有结果。这个方法在很多企业和单位中都有应用,尤其适合…...
日事清团队协作软件:智能制定计划,实时追踪任务进展,文件共享无缝协作,知识库一键沉淀成果
我们总是有微细目标,日事清可以帮助团队轻松共同制定计划、同步工作进展、共享工作资料、沉淀工作成果。 日事清具体如何帮助团队?你可以先了解以下这些基本功能模块。 从【计划】开始 在日事清中,【计划】是协同办公的开始,邀请…...
全球变暖(蓝桥杯 2018 年第九届省赛)
题目描述 你有一张某海域 NN 像素的照片,. 表示海洋、 # 表示陆地,如下所示: ....... .##.... .##.... ....##. ..####. ...###. .......其中 "上下左右" 四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有 2 座岛屿。 由…...
国际物流怎么找客户?选择适合自己的企业拓客平台
在国际物流行业,获客一直是企业发展的核心难题。无论是跨境电商、传统外贸,还是国际货代,找到精准的客户资源并高效转化,是决定企业能否抢占市场蓝海的关键。今天,我们就来聊聊如何选择一个真正适合的国际物流拓客平台…...
驱动-内核空间和用户空间数据交换
内核空间与用户控件数据交换 前面了解的字符设备中对 file_operations 结构体的进行了填充, 该 结构体的每一个成员都对应着一个系统调用, 例如 read、 write 等, 在字符设备相关的文章中有实验过对 调用函数进行了标志打印, 并没…...
智膳优选 | AI赋能的智慧食堂管理专家 —— 基于飞书多维表格和扣子(Coze)的智能解决方案
智膳优选 | AI赋能的智慧食堂管理专家 基于飞书多维表格和扣子(Coze)的智能解决方案 数据驱动餐饮管理,让每一餐都是营养与经济的完美平衡! “智膳优选”通过整合飞书与Coze,将数据智能引入校园餐饮管理࿰…...
FCOS目标检测
一、模型框架 FCOS采用的网络架构和RetinaNet一样,都是采用FPN架构,如图2所示,每个特征图后是检测器,检测器包含3个分支:classification,regression和center-ness。 对于特征图Fi∈RHWC,其相对…...
Linux中动态加载两个同名so(dlopen动态链接库)
// 当前路径下 ./test1.c int Func1(int a, int b) { return ab; } //编译生成so gcc -fPIC -shared -o libTest.so test1.c // 当前路径的test2文件夹中 ./test2/test2.c int Func1(int a, int b) { return a-b; } //编译生成同名so gcc -fPIC -shared -o …...
直播电商革命:东南亚市场的“人货场”重构方程式
一、人设经济3.0:从流量收割到情感基建 东南亚直播战场正经历从"叫卖式促销"到"沉浸式信任"的质变,新加坡市场成为最佳观察样本: 数据印证趋势:Shopee直播用户日均停留28分钟,超短视频平台&#…...
【CF】Day30——Codeforces Round 824 (Div. 2) C + Codeforces Round 825 (Div. 2) BC1
C. Phase Shift 题目: 思路: 好题,值得多看 这题我们看题目就能想到一个很显然的做法,那就是贪心地把每一个字母换成最前面的没使用过的字母 但是这样直接写是有问题的,因为题目说了最后要让所有的字母成一个换&…...
STM32 模块化开发指南 · 第 2 篇 如何编写高复用的外设驱动模块(以 UART 为例)
本文是《STM32 模块化开发实战指南》的第 2 篇,聚焦于“串口驱动模块的设计与封装”。我们将从一个最基础的裸机 UART 初始化开始,逐步实现:中断支持、环形缓冲收发、模块接口抽象与测试策略,构建一个可移植、可扩展、可复用的 UART 驱动模块。 一、模块化 UART 的设计目标…...
SSRF打靶总结
文章目录 一. PortSwigger1、本地服务器的基本SSRF2、基本的目标不是漏洞机3、Referer标头的外带SSRF4、简单黑名单的SSRF黑名单绕过思路: 5、重定向的SSRF6. 简单的白名单SSRF白名单绕过思路: 二、BWAPP1. SSRF 文件包含漏洞 | 内网探测2. XXE -> S…...
第五章:5.1 ESP32物联网应用 - MQTT协议深度教程
一、MQTT协议简介 1.1 发布/订阅模式 MQTT(Message Queuing Telemetry Transport)是一种轻量级物联网通信协议,采用发布/订阅模式: 发布者(Publisher):发送消息到指定主题(如&…...
c++知识点
高级模板技术45: 模板元编程:这是一种在编译期进行计算和代码生成的技术。通过模板的递归展开、特化等操作,可以实现一些复杂的功能,例如编译期的计算、类型安全的容器等。例如,使用模板元编程可以实现一个编译期计算斐…...
【ChCore Lab 01】Bomb Lab 拆炸弹实验(ARM汇编逆向工程)
文章目录 1. 前言2. 实验代码版本问题3. 关于使用问题4. 宏观分析5. read_line 函数介绍6. phase_0 函数6.1. read_int 函数6.2. 回到 phase_0 函数继续分析6.3. 验证结果 7. phase_1 函数7.2. 验证结果 8. phase_2 函数8.1. read_8_numbers 函数8.2. 回到 phase_2 函数继续分析…...
QStackedWidget讲解
简介 QStackedWidget 类在一次仅显示1个窗口的地方提供一个窗口栈。 头文件:#include qmake:QT widgets 基类:QFrame 属性 count : const int currentIndex : int 公有槽函数 void setCurrentIndex(int index) void setCurrentWidget(QWidget *widget)信号 void current…...
宝马集团加速 ERP 转型和上云之旅
宝马集团(BMW Group)作为全球领先的豪华汽车和摩托车制造商,致力于构建更加智能、绿色、人性化的出行体验。为了支持其全球化、数字化业务战略,宝马集团正在进行大规模的 IT 体系升级和 ERP 云转型。该项目以“RISE with SAP S/4H…...
AutoEval:现实世界中通才机器人操作策略的自主评估
25年3月来自 UC Berkeley 和 Nvidia 的论文“AutoEval: Autonomous Evaluation of Generalist Robot Manipulation Policies in the Real World”。 可规模化且可复现的策略评估一直是机器人学习领域长期存在的挑战。评估对于评估进展和构建更优策略至关重要,但在现…...
ARM Cortex M内存屏障指令__dsb( )和__isb( )
ARM Cortex-M 系列处理器中的 __dsb() 和 __isb() 是内存屏障指令,用于确保内存操作的顺序性和可见性,尤其在涉及外设、多核/多线程、自修改代码或关键系统配置时至关重要。 一,详细说明和典型应用场景 1. __dsb()(Data Synchron…...
deepseek热度已过?
DeepSeek的热度并没有消退,以下是具体表现: 用户使用量和下载量方面 • 日活跃用户量增长:DeepSeek已经成为目前最快突破3000万日活跃用户量的应用程序。 • 应用商店下载量:1月26日,DeepSeek最新推出的AI聊天机器人…...
使用 Datadog 和 Slack Alerts 监控 minikube
为什么要监控 minikube 集群?这是一个不错的练习,可以让你了解 DataDog 的设置过程并探索 K8s 指标产品。 本文将分享我的以下经验: 设置最新的 minikube部署示例应用程序创建 DataDog(试用)帐户使用 Helm 安装 Data…...
深入 Redis 持久化:从原理到企业级应用的全景图
🧠 什么是 Redis 持久化?为什么需要? Redis 是内存型数据库,默认所有数据都存在内存中,一旦断电,数据就会消失。为了避免重要数据丢失,Redis 提供了持久化机制,用于将内存中的数据保…...
NET模式下如何配置虚拟机的IP地址为静态的
1.查看网关: 2.找到虚拟机的网络配置文件 cd ./etc/sysconfig/network-scripts/ vim ifcfg-ens33 3.修改配置 BROWSER_ONLY"no" IPADDR192.168.122.120 NETMASK255.255.255.0 GATEWAY192.168.122.2 DNS18.8.8.8 4.重启网路服务 sudo systemctl rest…...
VMWare Workstation Pro17.6最新版虚拟机详细安装教程(附安装包教程)
目录 前言 一、VMWare虚拟机下载 二、VMWare虚拟机安装 三、运行虚拟机 前言 VMware 是全球领先的虚拟化技术与云计算解决方案提供商,通过软件模拟计算机硬件环境,允许用户在一台物理设备上运行多个独立的虚拟操作系统或应用。其核心技术可提升硬件…...
磐石云智能语音客服系统——技术革新引领服务新体验
在人工智能技术飞速发展的今天,企业对于智能化客户服务的需求日益增长。磐石云智能语音客服系统凭借其前沿技术架构与深度场景适配能力,正在重新定义人机交互的边界。本文将深入解析该系统如何通过技术创新实现服务效率与体验的双重突破。 一、意图识别…...
什么是iPaaS?
在当今数字化时代,企业面临着日益复杂的IT环境和不断增长的业务需求。随着云计算、微服务、物联网等技术的快速发展,企业需要更加高效、灵活且安全的方式来进行数据集成和应用集成。集成平台即服务(iPaaS)应运而生,成为…...
Vue3 中 Pinia 持久化的全面解析和最佳实践
Vue3 中 Pinia 持久化的全面解析 一、Pinia 简介 Pinia 是 Vue 的新一代状态管理库,它提供了简洁的 API,支持 Composition API,并且拥有良好的代码拆分和热更新能力。相比于 Vuex,Pinia 的代码结构更加扁平,易于理…...
蓝桥杯最后一天警告!!!
1.万能头文件 #include <bits/stdc.h> 2.一道题实在一点都不会,直接碰运气骗分 #include <bits/stdc.h> using namespace std;int main() {srand(time(0));printf("%d",rand()%101);//生成一个1到10之间的随机整数,并输出print…...
el-time-picker标签的使用
需求: 实现培训日期,用户可以选择某一天的日期,这个比较简单 <el-form-item label"培训日期" prop"startTime"><el-date-picker clearablev-model"form.startTime"type"date"placeholder…...
Mysql--基础知识点--85.1--Innodb自适应哈希索引
1. 自适应哈希索引的用途 InnoDB 的自适应哈希索引(Adaptive Hash Index, AHI)是 MySQL 数据库引擎中一项智能优化查询性能的功能。其核心作用如下: 加速等值查询 哈希索引通过哈希函数将键映射到固定位置,实现 O(1) 时间复杂度的…...
Matlab 考虑电机激励力的整车垂向七自由度的被动悬架和LQR控制
1、内容简介 Matlab 200-考虑电机激励力的整车垂向七自由度的被动悬架和LQR控制 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...
统一功能处理
SpringBoot统一功能处理 本节目表 1.掌握拦截器的使用,及其原理 2.学习统一数据返回格式和统一异常处理的操作 3.了解一些Spirng的源码 文章目录 SpringBoot统一功能处理前言一、拦截器是什么?二、使用步骤1.定义拦截器2.注册配置拦截器 三,适…...
LibreOffice Writer使用01去除单词拼写判断的红色下划线
这个软件还是非常有特色的,因为大家需要office的全部功能,常常忽略了这个软件的使用体验。 csdn不是特别稳定,linux也没有什么比较好的md编辑器,所以我选择这个软件来记录我的临时博客,原因无他,它可以保存…...
JAVA基础 - 高效管理线程隔离数据结构ThreadLocalMap
欢迎光临小站:致橡树 ThreadLocalMap 是 ThreadLocal 的核心底层数据结构,负责在每个线程中存储与 ThreadLocal 实例绑定的数据。它的设计目标是高效管理线程隔离数据,同时尽量减少内存泄漏风险。以下是其核心实现细节。 数据结构与设计目标…...
每日一题(小白)暴力娱乐篇25
由题意直知,要求将给定的字符串转为符合格式的字符串。首先我们来思考一下例如02/02/02这样的数字日月肯定不用进行修改,修改后需要加上对应的年份的前两位,题目要求1960年1月1日~2059年12年12月31日,(对1960年至2059年…...
地表水-地下水耦合建模全景解析暨SWAT-MODFLOW地表与地下协同模拟及多情景专题应用
第一、模型原理与层次结构 1.1流域水循环与SWAT模型 1.2 地下水模拟与MODFLOW模型 1.3 SWAT-MODFLOW地表-地下耦合模型 1.4 QSWATMOD 插件与功能介绍 1.5 模型实现所需软件平台 第二、QGIS软件 2.1 QGIS平台 2.2 QGIS安装 2.3 QGIS界面认识 2.4 QGIS常见数据格式 2.…...
在线论坛系统
在线论坛 项目介绍项目使用技术介绍前端技术栈后端技术栈 项目运行步骤说明后端运行步骤前端运行步骤 项目使用说明用户端功能管理员端功能 部分功能说明运行截图用户端管理员端 系统源码 项目介绍 这是一个基于现代技术栈开发的在线论坛系统,提供用户交流、内容分享…...
webrtc pacer模块(一) 平滑处理的实现
Pacer起到平滑码率的作用,使发送到网络上的码率稳定。如下的这张创建Pacer的流程图,其中PacerSender就是Pacer,其中PacerSender就是Pacer。这篇文章介绍它的核心子类PacingController及Periodic模式下平滑处理的基本流程。平滑处理流程中还有…...
新能源车「大三电」与「小三电」
一、大三电系统 动力电池 作为整车的能量核心,目前主流类型包括三元锂电池(NCM/NCA)和磷酸铁锂电池(LFP),前者能量密度高,后者安全性和成本优势显著。动力电池通过模组串联形成电池包…...
xlinx GT传输器学习
xlinx有2路refclk会输入到gtbank。此2路bank输入时钟是差分输入,经过IBUFDS_GTE2源语转换为单端。如下图。 从fpga外输入高速差分时钟。 差分时钟转换为单端。 单端时钟输入到gt_common模块 下图为gt内部结构图...
C++笔记之父类引用是否可以访问到子类特有的属性?
C++笔记之父类引用是否可以访问到子类特有的属性? code review! 参考笔记 1.C++笔记之在基类和派生类之间进行类型转换的所有方法 文章目录 C++笔记之父类引用是否可以访问到子类特有的属性?1.主要原因2.示例代码3.说明4.如何访问子类特有的属性5.注意事项6.总结在 C++ 中,…...
基于SSM框架的房屋租赁小程序开发与实现
概述 一个基于SSM框架开发的微信小程序房屋租赁管理系统,该项目实现了用户管理、中介管理、房源信息管理等核心功能。 主要内容 一、管理员模块功能实现 用户管理 管理员可对通过微信小程序注册的用户信息进行修改和删除操作,确保用户数据的准…...
大模型评估论文粗读“AGIEval: A Human-Centric Benchmark for Evaluating Foundation Models“
Zhong W, Cui R, Guo Y, et al. Agieval: A human-centric benchmark for evaluating foundation models[J]. arXiv preprint arXiv:2304.06364, 2023. 摘要翻译 评估大模型在处理人类层级的任务时的通用能力,是AGI发展和应用中至关重要的一环。传统的衡量标准通常依…...