C++ 虚表(Vtable)和虚基表(Vbtale)与 虚函数 和 虚继承
C++的虚表(Vtable)和虚基表(Vbtale)是与 虚函数 和 虚继承 密切相关的概念。它们都是用于支持多态(特别是动态绑定)和虚拟继承的机制,但它们的作用和实现方式有所不同。我们将逐步探讨虚表、虚基表的区别,以及虚函数和虚继承的概念。
1. 虚函数(Virtual Function)
在 C++ 中,虚函数是指在基类中声明为virtual
的成员函数,它允许通过基类的指针或引用调用派生类中的重写函数,而不是调用基类的函数。虚函数的主要特性是支持动态绑定(也叫运行时多态)。通过虚函数,程序可以在运行时决定调用哪个函数,而不是在编译时确定。
虚函数的基本特点:
- 使用
virtual
关键字声明。 - 被派生类重写时,基类指针或引用可以调用派生类中的重写版本。
- 支持动态多态。
class Base {
public:virtual void show() { std::cout << "Base class" << std::endl; }
};class Derived : public Base {
public:void show() override { std::cout << "Derived class" << std::endl; }
};int main() {Base* basePtr = new Derived();basePtr->show(); // 输出 "Derived class"return 0;
}
2. 虚表(Vtable)
虚表(Virtual Table) 是编译器用来支持虚函数的机制,它是一张函数指针表。每个包含虚函数的类都会有一张虚表,它存储了该类的所有虚函数的指针。每当对象的类型为多态时,通过虚表来实现虚函数调用。
- 虚表的创建:每个类(如果有虚函数)都会有一个虚表,虚表的大小和虚函数的数量相等。
- 虚表的成员:虚表中的每个项是一个指向虚函数的指针,指向的函数是类的虚函数(重写的版本)。
- 虚表的作用:通过虚表实现动态绑定,即运行时决定调用哪个函数。
如何工作:
- 当一个类包含虚函数时,编译器会为该类创建一个虚表。
- 每个对象会有一个指向虚表的指针(通常称为vptr),它指向该对象所属类的虚表。
- 当调用虚函数时,程序通过对象的
vptr
查找虚表,然后调用虚表中的相应函数。
虚表的例子:
假设有如下类:
class Base {
public:virtual void show() { std::cout << "Base class" << std::endl; }
};class Derived : public Base {
public:void show() override { std::cout << "Derived class" << std::endl; }
};
当对象Derived
创建时,编译器为Base
和Derived
分别创建虚表:
- Base的虚表:
- 指向
Base::show()
- 指向
- Derived的虚表:
- 指向
Derived::show()
- 指向
对象Derived
将有一个vptr
指针,指向Derived
的虚表。当调用show()
时,程序通过vptr
查找Derived
的虚表,并调用Derived::show()
。
3. 虚基表(Vbtale)
虚基表(Virtual Base Table) 主要与虚继承有关。虚继承是一种继承方式,它解决了菱形继承问题(钻石问题)。在虚继承中,当一个类被多个基类继承时,多个基类会共享一个虚基类的实例。虚基表是用来处理虚继承的,尤其是用于指向虚基类子对象的指针。
- 虚基表的创建:虚基表是针对虚基类创建的。当类A虚继承类B时,类A会有一个虚基表,指向虚基类B的实例。虚基表存储了虚基类子对象的访问控制信息。
- 虚基表的作用:在多重继承情况下,虚基表解决了虚基类对象如何共享和访问的问题。
虚继承的示例:
class A {
public:int x;A() : x(0) {}
};class B : virtual public A { // 虚继承A
public:int y;B() : y(1) {}
};class C : virtual public A { // 虚继承A
public:int z;C() : z(2) {}
};class D : public B, public C {
public:int w;D() : w(3) {}
};
在上述例子中,B
和C
都虚继承了A
,而D
则同时继承了B
和C
。通过虚继承,B
和C
都共享A
的一个实例,避免了“钻石继承”问题(即A
的多个副本)。
虚基表的工作方式:
- 类
D
会有一个虚基表,用来指向类A
的唯一实例。 - 虚基表会存储如何访问虚基类
A
的字段(比如A::x
)。 - 在类
D
的构造函数中,虚基表会确保A
的唯一实例正确初始化。
4. 虚函数、虚继承与虚表的关系
- 虚函数:在支持多态的类中,虚函数是用来在运行时实现动态绑定的。每个包含虚函数的类会有一个虚表,虚表中存储指向虚函数的指针。
- 虚继承:虚继承是解决多重继承中虚基类重复继承问题的机制。虚继承确保多个派生类共享同一个虚基类实例,避免了“菱形继承”问题。虚基表用于管理虚基类实例,并确保虚基类对象的唯一性。
- 虚表与虚基表:
- 虚表用于虚函数的动态绑定,在普通的继承层次结构中使用。
- 虚基表用于虚继承,在虚继承结构中存储虚基类的访问信息。
5. 虚表与虚基表的区别
特性 | 虚表(Vtable) | 虚基表(Vbtale) |
---|---|---|
主要用途 | 支持虚函数的动态绑定和多态机制 | 解决虚继承中的菱形继承问题,确保虚基类共享实例 |
创建时机 | 每个有虚函数的类创建虚表 | 每个有虚继承的类创建虚基表 |
存储内容 | 存储指向虚函数的指针 | 存储虚基类子对象的访问控制信息 |
作用 | 通过vptr支持虚函数的动态调用 | 通过虚基表管理虚基类的唯一实例 |
位置 | 每个类有一张虚表 | 只与虚继承相关,涉及虚基类的继承结构 |
在 C++ 中,虚表(Vtable)和虚基表(Vbtale)**是通过编译器的实现来支持虚函数和虚继承的机制。它们通过特定的数据结构在内存中存储,并且可以通过一些方法可视化或理解它们在内存中的布局。这里我们将详细解释这些表在内存中的存储方式,并说明如何可视化它们。
1. 虚表(Vtable)的内存存储方式
虚表是用来支持虚函数调用的机制。每个包含虚函数的类会有一个虚表,它存储了指向该类虚函数的指针。每个对象会包含一个指向虚表的指针(通常称为 vptr
),用来实现动态绑定。下面我们将展示虚表和虚表指针在内存中的布局。
内存结构:
#include <iostream>class Base {
public:virtual void show() {std::cout << "Base class" << std::endl;}
};class Derived : public Base {
public:void show() override {std::cout << "Derived class" << std::endl;}
};int main() {Base* basePtr = new Derived();basePtr->show(); // Output: Derived classreturn 0;
}
虚表的内存布局:
- 虚表(Vtable):
Base
类的虚表包含指向Base::show()
的指针。Derived
类的虚表包含指向Derived::show()
的指针。
- 虚表指针(vptr):
- 每个对象(比如
basePtr
)都有一个指针,指向相应的虚表。在Derived
对象的情况下,vptr
指向Derived
类的虚表。
- 每个对象(比如
内存结构大致如下:
+------------------+ +----------------------+| Base object | | Derived object || | ------> | || vptr (pointer) | ------------> | Derived Vtable |+------------------+ | || show() -> Derived::show() |+----------------------+Vtable for Base: Vtable for Derived:+-------------------------+ +---------------------------+| Base::show() -> Base::show() | | Derived::show() -> Derived::show() |+-------------------------+ +---------------------------+
内存细节:
- 虚表指针 (
vptr
): 每个Base
类或其派生类对象中会有一个指向虚表的指针。在创建Derived
类型对象时,vptr
会指向Derived
的虚表,而不是Base
的虚表。 - 虚表: 在内存中是一个数组,存储类中所有虚函数的指针(在本例中只有
show()
函数)。
如何可视化:
vptr
是对象的第一个成员(在很多编译器中),它指向该对象所属类的虚表。- 虚表是一个静态的数组,包含了指向虚函数的指针。
2. 虚基表(Vbtale)的内存存储方式
虚基表与虚继承有关,目的是解决菱形继承问题,确保多个派生类通过虚继承共享同一个虚基类实例。虚基表存储了指向虚基类子对象的指针。虚基表主要用于多重继承中涉及虚继承的部分。
内存结构:
假设我们有以下虚继承的例子:
class A {
public:int x;A() : x(0) {}
};class B : virtual public A {
public:int y;B() : y(1) {}
};class C : virtual public A {
public:int z;C() : z(2) {}
};class D : public B, public C {
public:int w;D() : w(3) {}
};
虚基表的内存布局:
-
虚基表(Vbtale):
- 类
D
会有一个虚基表,指向类A
的唯一实例。 - 虚基表在内存中存储了如何访问虚基类
A
的成员(比如A::x
)。
- 类
-
虚基表指针(vbtptr):
- 类
D
对象会有一个指针,指向D
的虚基表。 - 每个虚基类(如
A
)有一个指针,指向该虚基类实例。
- 类
内存结构大致如下:
+---------------------+ +--------------------+| D object | | B object || | ------> | || vptr (D Vtable) | ------------> | B Vtable || vbtptr (A Vbtale) | ------------> | A (shared instance)|+---------------------+ +--------------------+| C object | | || | ------> | C Vtable |+---------------------+ +--------------------+Vtable for D: Virtual Base Table for A:+------------------------+ +----------------------------+| D::show() -> D::show() | | A::x (shared instance) |+------------------------+ +----------------------------+Vtable for B: Vtable for C:+------------------------+ +----------------------------+| B::show() -> B::show() | | C::show() -> C::show() |+------------------------+ +----------------------------+
内存细节:
- 虚基表指针 (
vbtptr
): 类D
对象会有一个指向虚基表的指针,虚基表存储着如何访问共享的虚基类A
。 - 虚基表: 每个虚基类(如
A
)的实例只会在内存中存在一份。虚基表用于确保多个派生类共享这份实例。
3. 如何可视化这些表的内存布局
要在程序中可视化虚表和虚基表的内存布局,你可以通过使用调试工具(如 GDB、Visual Studio 调试器)来查看类的虚表指针和虚表内容。也可以通过以下方式手动展示内存中的布局:
使用 GDB 调试器查看虚表:
- 在程序中设置一个断点并运行程序。
- 在 GDB 中查看对象的虚表指针(
vptr
):- 对于
Derived
类对象,查看vptr
指向的虚表。 - 可以使用 GDB 命令如
info vtbl
或直接打印对象的地址来查看虚表。
- 对于
使用 offsetof
获取 vptr
:
可以使用 offsetof
宏来查看对象中 vptr
的偏移位置(通常是对象的第一个成员)。
代码模拟:
std::cout << "vptr of basePtr: " << *(reinterpret_cast<void**>(basePtr)) << std::endl;
这会打印出 basePtr
的 vptr
,即指向虚表的指针。
虚函数:支持运行时的多态,允许派生类重写基类的虚函数。
- 虚表(Vtable):支持虚函数的动态绑定,每个包含虚函数的类都有一个虚表。虚表存储指向虚函数的指针。
- 虚函数:支持运行时的多态,允许派生类重写基类的虚函数。
- 虚基表(Vbtale):支持虚继承,确保多个继承路径共享同一个虚基类实例。虚基表存储指向虚基类实例的指针。
- 内存布局:
vptr
指向虚表,而虚表则包含虚函数指针;虚基表指向虚基类实例,在虚继承中使用。
相关文章:
C++ 虚表(Vtable)和虚基表(Vbtale)与 虚函数 和 虚继承
C的虚表(Vtable)和虚基表(Vbtale)是与 虚函数 和 虚继承 密切相关的概念。它们都是用于支持多态(特别是动态绑定)和虚拟继承的机制,但它们的作用和实现方式有所不同。我们将逐步探讨虚表、虚基表…...
2021年全国研究生数学建模竞赛华为杯E题信号干扰下的超宽带(UWB)精确定位问题求解全过程文档及程序
2021年全国研究生数学建模竞赛华为杯 E题 信号干扰下的超宽带(UWB)精确定位问题 原题再现: 一、背景 UWB(Ultra-Wideband)技术也被称之为“超宽带”,又称之为脉冲无线电技术。这是一种无需任何载波,通过发送纳秒…...
SpringCould+vue3项目的后台用户管理的CURD【Taurus教育平台】
文章目录 一.SpringCouldvue3项目的后台用户管理的CURD【Taurus教育平台】 1.1 背景 二.用户列表(分页查询) 2.1 前端Vue3 (Vue3-Element-Admin)2.2 后端SpringCould 处理 三. 用户信息删除 3.1 前端Vue3 (Vue3-Eleme…...
草图绘制技巧
1、点击菜单栏文件–》新建–》左下角高级新手切换–》零件; 2、槽口:直槽口,中心点槽口,三点源槽口,中心点圆弧槽口; 3、草图的约束:需要按住ctrl键,选中两个草图,然后…...
机器学习-1:线性回归
常用的线性回归模型主要有以下这些 简单线性回归多元线性回归多项式回归岭回归套索回归弹性网络回归逐步回归 一.简单的一元线性回归 1.导入必备的库 #导入必备的库 import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.model_selection …...
android 的抓包工具
charles 抓包工具 官网地址 nullCharles Web Debugging Proxy - Official Sitehttps://www.charlesproxy.com/使用手册一定记得看官网 SSL Certificates • Charles Web Debugging Proxy http请求: 1.启动代理: 2.设置设备端口 3.手机连接当前代理 …...
AJAX 与 ASP 的深入探讨
AJAX 与 ASP 的深入探讨 引言 随着互联网技术的飞速发展,Web应用程序的交互性和性能要求越来越高。AJAX(Asynchronous JavaScript and XML)和ASP(Active Server Pages)作为两种重要的Web开发技术,在提高Web应用程序性能和用户体验方面发挥着重要作用。本文将深入探讨AJ…...
Qt开发①Qt的概念+发展+优点+应用+使用
目录 1. Qt的概念和发展 1.1 Qt的概念 1.2 Qt 的发展史: 1.3 Qt 的版本 2. Qt 的优点和应用 2.1 Qt 的优点: 2.2 Qt 的应用场景 2.3 Qt 的应用案例 3. 搭建 Qt 开发环境 3.1 Qt 的开发工具 3.2 Qt SDK 的下载和安装 3.3 Qt 环境变量配置和使…...
函数调用过程的详细解析
目录 一、C语言示例代码 二、汇编代码分步解析(x86架构) 1. 调用前:参数压栈(从右向左) 2. 进入被调函数:保存栈帧 3. 执行函数逻辑 4. 恢复栈帧并返回 三、内存布局图示(调用过程中栈的变…...
教师管理系统在职校中的应用与优势
随着信息技术的不断发展,教师管理系统在职校中的应用越来越广泛。这一系统通过集成教师信息、教学资源和日程安排等功能,为职校管理带来了诸多便利和优势。 教师管理系统能够显著提高管理效率。传统的人工管理方式往往繁琐且易出错,而教师管理…...
【系统架构设计师】虚拟机体系结构风格
目录 1. 说明2. 解释器体系结构风格3. 规则系统体系结构风格4. 例题4.1 例题1 1. 说明 1.p263。2.虚拟机体系结构风格的基本思想是人为构建一个运行环境,在这个环境之上,可以解析与运行自定义的一些语言,这样来增加架构的灵活性。3.虚拟机体…...
UE C++ UObject 功能的初步总结
一. Uboject的 1.垃圾回收:上篇文章介绍过 2.引用更新 1. 反射:之前的文章描述过的CDO,还有就是C与蓝图相互调用UFUCTION,UPROPERTY 2.序列化:编辑器的资产序列化到磁盘上,变为.uasset等格式的资产文件。所有的东西存在编辑器里ÿ…...
Django 美化使用ModelForm的输入框
在初次使用ModelForm时,我的html文件代码如下,主要内容是显示一个卡片式表单,通过循环遍历 form 对象动态生成表单字段 {% extends layout.html %}{% block content %} <div class"container"><div class"c1"&g…...
SQL在云计算中的新角色:重新定义数据分析
文章目录 1. 云计算与数据分析的融合2. SQL在云计算中的新角色3. 分布式SQL查询引擎4. SQL-on-Hadoop解决方案5. SQL与其他数据分析工具的集成6. 实时数据分析与SQL7. SQL在云数据仓库中的角色8. 安全性与隐私保护9. SQL的未来展望《SQL数据分析实战(第2版ÿ…...
使用Redis实现分布式锁,基于原本单体系统进行业务改造
一、单体系统下,使用锁机制实现秒杀功能,并限制一人一单功能 1.流程图: 2.代码实现: Service public class VoucherOrderServiceImpl extends ServiceImpl<VoucherOrderMapper, VoucherOrder> implements IVoucherOrderSe…...
用Python实现线性回归:从数学原理到代码实战
一、前言:为什么线性回归是AI必修课? 作为机器学习领域的"Hello World",线性回归算法具有三大核心价值: 1️⃣ 理解监督学习的底层逻辑(特征工程→模型训练→预测输出) 2️⃣ 掌握梯度下降等优化…...
JS 链表
文章目录 链表题的一些总结两种链表定义set存储链表节点,存的是整个空间同时处理长短不一的两个链表处理方法 while(l1 || l2)处理方法 while(l1 & l2) dummyhead的使用 链表题的一些总结 两种链表定义 class class ListNode {val;next null;constructor(va…...
AI时代:架构师的困境与救赎
在GitHub Copilot生成完整函数、ChatGPT编写业务逻辑的今天,编程正经历着前所未有的范式变革。某在线教育平台的技术负责人曾向我展示:团队使用AI工具3个月后,年轻工程师在架构评审会上对Kafka消息队列的消费机制支支吾吾,却在IDE…...
1-10 github注册仓库
如何在github中注册一个仓库? 1.0 注册仓库 1-1 GitHub的账号注册教程_github注册-CSDN博客 2.0 删除仓库 1-2 从github中删除创建的仓库_github删除仓库-CSDN博客 3.0 创建仓库 1-3 【教程】GitHub新建仓库新手教程_github仓库-CSDN博客 4.0 github操作 1-4 1-9 克…...
JavaScript作用域与闭包
一 作用域 在JavaScript中,作用域(Scope)指的是变量和函数的可访问性范围。在JavaScript中,作用域有全局作用域和局部作用域之分。 全局作用域(Global Scope):全局作用域指的是在代码中任何位置…...
docker容器部署jar应用导入文件时候报缺少字体错误解决
如题,在导入文件时候报错如下: Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11FontManager 经查是缺少对应字体,解决办法有两张: 第一种:…...
lean4安装
目录 lean4安装windows 证明等比数列和函数函数 lean4安装windows lean4 windows一键安装(全网最简单的安装流程)_lean4安装-CSDN博客 证明等比数列和函数函数 import Mathlib.Data.Real.Basic -- 导入实数基础库 import Mathlib.Tactic.Simps.Basic -- 导入简化策略 im…...
HTML的入门
一、HTML HTML(HyperText Markup Language,超文本标记语言)是一种用来告知浏览器如何组织页面的标记语言。 超文本:就是超越了文本;HTML不仅仅可以用来显示文本(字符串、数字之类),还可以显示视频、音频等…...
Jenkins 部署 之 Mac 一
Jenkins 部署 之 Mac 一 一.Jenkins 部署依赖 JDK 环境 查看 Mac JDK 环境,如果没有安装,先安装 打开终端输入命令:java -version Mac安装配置 JDK 二. 检查 HomeBrew 安装 检查 HomeBrew 是否安装,终端输入命令:brew -v Mac安装HomeB…...
matlab平面波展开法计算的二维声子晶体带隙
平面波展开法计算的二维声子晶体带隙,分别是正方与圆形散射体形成正方格子声子晶体,最后输出了能带图的数据,需要自己用画图软件画出来。 列表 平面波展开法计算二维声子晶体带隙/a2.m , 15823 平面波展开法计算二维声子晶体带隙/a4.m , 942…...
爬虫实战:利用代理ip爬取推特网站数据
引言 亮数据-网络IP代理及全网数据一站式服务商屡获殊荣的代理网络、强大的数据挖掘工具和现成可用的数据集。亮数据:网络数据平台领航者https://www.bright.cn/?promoRESIYEAR50/?utm_sourcebrand&utm_campaignbrnd-mkt_cn_csdn_yingjie202502 在跨境电商、社…...
【kafka系列】生产者
目录 发送流程 1. 流程逻辑分析 阶段一:主线程处理 阶段二:Sender 线程异步发送 核心设计思想 2. 流程 关键点总结 重要参数 一、核心必填参数 二、可靠性相关参数 三、性能优化参数 四、高级配置 五、安全性配置(可选࿰…...
Kafka日志数据深度解析:从基础查看到高级操作全攻略
#作者:孙德新 文章目录 查看log日志文件(kafka-dump-log.sh)1、查看Log文件基本数据信息2、index文件健康性检查(--index-sanity-check)3、转储文件(--max-message-size)4、偏移量解码(--offsets-decoder)5、日志数据解析(--transaction-log-decoder)6、查询Log文件…...
单例模式、构造函数、左值右值
拷贝构造函数 简单的说就是——用一个对象构造另外一个对象 class Myclass {public:int d0;Myclass(int d_){d d_}; //常用的构造函数Myclass(Myclass c) //拷贝构造函数{d c.d;} }; //对比 class Myclass {public:int d0;Myclass(int d_){d d_}; //常用的构造函数Myclass…...
DeepSeek+即梦 做AI视频
DeepSeek做AI视频 制作流程第一步:DeepSeek 生成视频脚本和分镜 第二步:生成分镜图片绘画提示词第三步:生成分镜图片第四步:使用可灵 AI 工具,将生成的图片转成视频。第五步:剪映成短视频 DeepSeek 真的强&…...
「软件设计模式」建造者模式(Builder)
深入解析建造者模式:用C打造灵活对象构建流水线 引言:当对象构建遇上排列组合 在开发复杂业务系统时,你是否经常面对这样的类:它有20个成员变量,其中5个是必填项,15个是可选项。当用户需要创建豪华套餐A&…...
Android设备 网络安全检测
八、网络与安全机制 6.1 网络框架对比 volley: 功能 基于HttpUrlConnection;封装了UIL图片加载框架,支持图片加载;网络请求的排序、优先级处理缓存;多级别取消请求;Activity和生命周期的联动(Activity结束生命周期同时取消所有网络请求 …...
安心联车辆管理系统的硬件架构详解
安心联车辆管理系统的硬件架构可分为车载设备和后端平台设备两大部分,以下是详细的硬件组成及功能说明: 一、车载设备 定位与通信模块 北斗/GPS双模定位模块:支持厘米级定位精度,兼容JT/T808、JT/T809等交通部标准协议,…...
适用于iOS的应用商店优化(ASO)清单
面对App Store的激烈竞争,您想优化您的应用使其在竞争中脱颖而出,但又不知道应该从哪里开始。我们已经为您准备好了!我们整理了一份适用于iOS的应用商店优化(ASO)检查清单,用以帮助您入门并提高您在App Sto…...
linux概念详解
用户守护进程 用户空间守护进程是一些在后台运行的长期服务程序,提供系统级服务。 下面举一些例子。 网络服务: 如sshd(SSH服务)、httpd(HTTP服务)。 sshd:sshd 守护进程会在后台运行&#x…...
嵌入式开发应该具备哪些编程思维?
目录 1、资源限制思维 2、实时性思维 3、硬件抽象思维 4、中断驱动思维 5、功耗优化思维 6、可靠性和容错思维 7、并发和同步思维 8、故障排除与调试思维 9、状态机思维 嵌入式开发与一般的软件开发不同,嵌入式系统通常受到资源(内存、处理器、…...
MongoDB索引介绍
索引简述 索引是什么 索引在数据库技术体系中占据了非常重要的位置,其主要表现为一种目录式的数据结构,用来实现快速的数据查询。通常在实现上,索引是对数据库表(集合)中的某些字段进行抽取、排列之后,形成的一种非常易于遍历读取…...
编程速递-庆祝Delphi诞生30周年!
庆祝Delphi 30周年纪念是一个特别的时刻。 回到1995年,也就是30年前,在微软Windows和互联网时代的曙光初现之时,Borland Delphi的创建者们无法想象,当时使用Borland Delphi构建的应用程序至今仍在运行——为全世界数十亿人服务。…...
YOLOv11-ultralytics-8.3.67部分代码阅读笔记-tuner.py
tuner.py ultralytics\utils\tuner.py 目录 tuner.py 1.所需的库和模块 2.def run_ray_tune(model, space: dict None, grace_period: int 10, gpu_per_trial: int None, max_samples: int 10, **train_args,): 1.所需的库和模块 # Ultralytics 🚀 AGPL-…...
一文说清楚什么是Token以及项目中使用Token延伸的问题
首先可以参考我的往期文章,我这里说清楚了Cookie,Seesion,Token以及JWT是什么 其实Token你就可以理解成这是一个认证令牌就好了 详细分清Session,Cookie和Token之间的区别,以及JWT是什么东西_还分不清 cookie、sessi…...
VueRouter 实例
分析下列代码 const router new VueRouter({mode:history,routes }) 1.const router new VueRouter({ ... })用来创建一个 Vue Router 实例,用于管理 Vue.js 应用的路由。2.mode: history: 作用:启用 HTML5 History 模式,去除…...
【算法工程】解决linux下Aspose.slides提示No usable version of libssl found以及强化推理模型的短板
1. 背景 构建ubuntu镜像,然后使用Aspose.slides解析PPTX文档,发现一直提示“No usable version of libssl found”。 2. 尝试 使用deepseek R1、kimi1.5、chatgpt o3,并且都带上联网能力,居然还是没有一个能够真正解决…...
解析浏览器中JavaScript与Native交互原理:以WebGPU为例
引言 随着Web应用复杂度的提升,开发者对浏览器访问本地硬件能力的需求日益增长。然而,浏览器必须在开放性与安全性之间找到平衡——既不能放任JavaScript(JS)随意操作系统资源,又要为高性能计算、图形渲染等场景提供支…...
小火车理论
格助词...
深度学习框架探秘|Keras 应用案例解析以及 Keras vs TensorFlow vs PyTorch
引言 上一篇文章《深度学习框架探秘|Keras:深度学习的魔法钥匙》 我们初步学习了 Keras,包括它是什么、具备哪些优势(简洁易用的 API、强大的兼容性、广泛的应用领域),以及基本使用方法。本文,…...
【01 背包】
01 背包解题思路: 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。 这是标准的背包问题,每一件物品其实只有两个状…...
算法10-二分查找算法
一、二分查找算法概念 二分查找(Binary Search)是一种高效的查找算法,适用于在有序数组中快速查找目标值。它的核心思想是通过不断缩小查找范围,将时间复杂度从线性查找的 O(n) 优化到 O(log n)。 二、二分查找的流程图 以下是二…...
变相提高大模型上下文长度-RAG文档压缩-3.优化map-reduce(reranker过滤+社区聚类)
我遇到的业务问题实际上是RAG需要处理很多同一对象的日常报告,不像常识类问题,它的相关Document更多而且更分散,日常报告代表数据库里有很多它的内容,而且对象可能只在段落中的几句话提及到。top-k数量受限于大模型长度࿰…...
算法11-分治算法
一、分治算法概念 分治算法(Divide and Conquer)是一种重要的算法设计思想,通过将问题分解为多个子问题,分别解决后再合并结果,从而解决原问题。分治算法的核心思想是“分而治之”,通常包含三个步骤&#…...
Golang internals
To be continued... time.Time golang的时区和神奇的time.Parse context.Context Go Context的踩坑经历 sync.Pool sync.Pool workflow in Go 1.12 new shared pools in Go 1.13 什么是cpu cache理解 Go 1.13 中 sync.Pool 的设计与实现Go: Understand the Design of Sync.Pool…...