【C/C++】C++返回值优化:RVO与NRVO全解析
文章目录
- C++返回值优化:RVO与NRVO全解析
- 1 简介
- 2 RVO vs NRVO
- 3 触发条件
- 4 底层机制
- 5 应用场景
- 6 验证与限制
- 7 性能影响
- 8 补充说明
- 9 总结
C++返回值优化:RVO与NRVO全解析
返回值优化(Return Value Optimization, RVO)是编译器通过消除临时对象创建和销毁来提升性能的关键技术。
1 简介
RVO类型:
- 具名返回值优化(NRVO)
- 匿名返回值优化(RVO)
启用返回值优化的条件
-
返回局部对象
返回的表达式必须是函数内部定义的局部对象(非参数、非全局对象),且未被绑定到外部引用/指针。例如:std::string createString() {std::string s = "Hello";std::string t = std::move(s); // s被移动,但仍为局部对象return s; // NRVO仍可能触发(返回s的地址,即使其内容为空) }
-
返回类型与局部对象类型严格匹配
返回的表达式必须直接构造目标类型的对象,或与返回类型完全一致。例如:// 正常用例 std::vector<int> getVector() {return {1, 2, 3}; // 临时对象直接构造到调用者栈帧 }// 错误用例 struct A {}; struct B { operator A() const { return A(); } };A createA() {B b;return b; // 隐式转换生成临时A对象,NRVO不触发 }
-
无分支或条件返回路径
若函数存在多个返回路径且返回不同对象,RVO/NRVO可能失效;若所有路径返回同一对象,优化仍可能生效。例如:std::string getString(bool flag) { std::string s; if (flag) s = "Yes"; else s = "No"; return s; // NRVO生效(所有路径返回s) }
-
不使用
std::move
或显式右值转换
使用std::move
会强制触发移动语义,绕过RVO的优化逻辑:std::string createString() {std::string s = "Hello";return std::move(s); // 强制移动,RVO失效 }
-
C++11及以上标准
C++17及以上标准强制要求部分场景的RVO(如返回临时对象),其他场景(如NRVO)仍依赖编译器优化。- C++17 起,对纯右值(如临时对象)的RVO是强制的(称为 “mandatory copy elision”)。
- NRVO 仍是编译器可选的优化,非强制要求。
- C++11/14 允许但不强制要求RVO/NRVO。
2 RVO vs NRVO
特性 | RVO(匿名返回值优化,URVO) | NRVO(具名返回值优化) |
---|---|---|
优化对象 | 匿名临时对象(如 return Obj{}; 或 return {}; ) | 具名局部变量(如 return obj; ,obj 是函数内定义的变量) |
编译器处理方式 | 直接在调用者栈帧构造对象,跳过临时对象创建(C++17 起强制) | 将具名变量直接构造到调用者栈帧(编译器可选优化) |
标准要求 | C++17 起强制要求(仅限纯右值场景) | 始终非强制,依赖编译器实现(即使 C++17) |
典型场景 | 返回直接构造的临时对象(无命名) | 返回函数内已定义且未被移动的具名对象(需满足单一路径返回) |
失败场景 | 返回需隐式转换的对象(如 return B{}; ,但函数返回类型为 A ) | 多分支返回不同对象、使用 std::move 、绑定到外部引用/指针等 |
3 触发条件
- RVO(匿名返回值优化)
-
条件:
- 返回的表达式是 纯右值(如 return A{} 或 return A(1))。
- 返回类型与临时对象类型严格匹配,无需用户定义的隐式转换。
- 无分支返回不同对象(所有返回路径必须返回同一纯右值表达式)。 -
示例:
std::string create() {return "Hello"; // 触发隐式转换(const char[6] → std::string),但 C++17 强制 RVO 仍会生效,因为该场景属于直接构造目标类型对象,无需用户定义的类型转换操作符// return std::string("Hello"); // 显式构造临时对象,严格匹配类型 }// 需明确区分「直接构造目标类型对象」和「需要用户定义的隐式转换」两种场景
- NRVO(具名返回值优化)
-
条件:
- 返回的表达式是 同一具名局部变量(所有返回路径必须返回该变量)。
- 局部变量类型与函数返回类型严格匹配,无需用户定义的隐式转换。
- 局部变量未被绑定到外部引用/指针。
-
示例:
std::string create() {std::string s = "Hello";return s; // 具名变量s,触发NRVO(若编译器支持) }
4 底层机制
RVO的底层实现通过编译器对代码的重写完成,核心步骤包括:
-
直接构造到调用者存储位置
编译器将返回值的目标内存预分配到调用者提供的存储位置(可能是栈或堆),函数内部直接在此地址构造对象,跳过临时对象的创建。
示例:// 原始代码 std::string func() { return "Hello"; } std::string s = func();// 编译器优化后等效逻辑 std::string s; // 分配目标内存 func(&s); // 传递目标地址 void func(std::string* __result) {new (__result) std::string("Hello"); // 直接构造到目标地址 }
-
消除拷贝/移动构造函数调用
通过传递隐藏指针参数,在目标地址直接构造对象,避免调用拷贝/移动构造函数。
示例:// 原始代码 std::vector<int> create() { return {1,2,3}; } auto v = create();// 优化后等效逻辑 std::vector<int> v; // 分配目标内存 create(&v); // 传递目标地址 void create(std::vector<int>* __result) {new (__result) std::vector<int>{1,2,3}; // 直接构造到目标地址 }
-
NRVO 的局部变量地址替换
对于具名局部变量,编译器将其分配到调用者提供的目标地址,直接复用该内存,无需额外拷贝。
示例:std::string func() {std::string s = "Hello"; // s 的地址实为调用者提供的目标地址return s; // 直接返回已构造好的对象 }
-
失败场景说明
RVO/NRVO 在以下情况可能失效:- 函数返回不同对象(如多分支返回不同变量)
- 返回参数或全局对象
- 显式使用
std::move
或类型转换
优化类型 | 核心机制 | 失败条件 |
---|---|---|
RVO | 直接在调用者地址构造匿名临时对象 | 返回非临时对象、存在分支返回不同对象 |
NRVO | 将局部变量分配到调用者地址并复用 | 返回不同对象、显式移动操作 |
5 应用场景
场景 | 是否触发 RVO | 原因 |
---|---|---|
返回临时对象 | ✅ 触发 | 符合 RVO 核心条件(匿名对象直接构造到调用者内存)。 |
直接返回 emplace 生成的匿名对象 | ✅ 触发 | 等效于返回临时对象,编译器直接优化。 |
返回容器中 emplace 构造的元素 | ❌ 不触发 | 返回的是容器元素的拷贝,无法直接构造到调用者内存。 |
返回 std::move 对象 | ❌ 不触发 | 强制移动语义抑制优化。 |
分支返回不同对象 | ❌ 不触发 | 编译器无法静态确定单一目标地址。 |
返回全局/静态对象 | ❌ 不触发 | 对象生命周期不依赖调用者,无法复用内存。 |
优化类型 | 触发条件 | 示例代码 |
---|---|---|
RVO | 返回 匿名临时对象 | return MyClass(42); |
NRVO | 返回 具名局部对象 | MyClass obj; return obj; |
不触发 | 返回非局部对象或存在分支控制流 | return global_obj; 或 if (cond) return a; else return b; |
- 返回
emplace
构造的对象- 可能场景分析
代码示例 | 是否触发优化 | 优化类型 | 原因 |
---|---|---|---|
直接返回 emplace 生成的临时对象 | ✅ 触发 RVO | RVO | 直接在调用者内存构造匿名对象:return MyContainer().emplace(42); |
返回容器中 emplace 构造的元素 | ❌ 不触发 | 无 | 返回的是容器内元素的拷贝,非直接构造到调用者内存:return vec.emplace_back(42); |
返回具名局部对象(通过 emplace 初始化) | ✅ 触发 NRVO | NRVO | 返回具名变量,编译器复用其内存:MyClass obj; obj.emplace(42); return obj; |
-
结论
-
触发 RVO 的条件:仅当
emplace
直接构造 匿名临时对象 并返回时生效。 -
不触发的情况:若
emplace
用于构造其他对象(如容器元素)或返回具名变量(触发 NRVO 而非 RVO),则优化可能失效。 -
实践建议
-
优先返回匿名临时对象:
// 推荐:直接触发 RVO MyClass create() {return MyClass(42); }
-
避免在复杂逻辑中使用
emplace
:// 不推荐:可能无法触发优化 MyClass create() {std::vector<MyClass> vec;vec.emplace_back(42);return vec[0]; // 拷贝操作,无优化 }
-
明确区分 RVO 与 NRVO:
// NRVO 示例(返回具名变量) MyClass create() {MyClass obj;obj.init(42); // 具名变量初始化return obj; // 触发 NRVO }
6 验证与限制
- RVO/NRVO 验证方法
代码示例:
class Test {
public:Test() { std::cout << "Constructed\n"; }Test(const Test&) { std::cout << "Copied\n"; }~Test() { std::cout << "Destroyed\n"; }
};Test func() { return Test(); } // RVO 测试int main() {Test t = func();
}
验证步骤:
- C++17 标准(强制优化):
- 无论是否使用
-fno-elide-constructors
,输出均为一次构造和析构。
- 无论是否使用
- C++14 及以下标准:
- 默认编译:输出一次构造和析构(RVO 优化)。
- 使用
-fno-elide-constructors
:输出构造 → 拷贝 → 析构(临时对象) → 析构(主对象)。
- 失效场景细化
优化类型 | 失效场景 | 示例代码 | 编译器行为 |
---|---|---|---|
RVO | 返回 std::move(obj) | return std::move(Test()); | 强制移动,抑制 RVO |
分支返回不同对象 | if (cond) return a; else return b; | 无法确定目标地址 | |
NRVO | 多返回路径 | return flag ? s1 : s2; | GCC/Clang 警告优化失败 |
返回参数或全局变量 | return global_obj; | 不触发任何优化 |
关键结论
- C++17 强制优化:
对纯右值(如return A{};
)的拷贝省略是强制性的,即使拷贝/移动构造函数不可用。 - 编译器差异:
- Clang 对复杂 NRVO 场景的优化能力优于 GCC。
- MSVC 在
/Od
(禁用优化)模式下会完全禁用 RVO/NRVO。
- 最佳实践:
- 优先返回匿名临时对象(触发 RVO)。
- 避免在返回语句中使用
std::move
。 - 单一返回路径可最大化触发 NRVO。
7 性能影响
通过合理设计返回值逻辑并启用编译器优化选项(如-O2
),开发者可充分利用RVO提升程序性能。
优化类型 | 减少的操作 | 典型性能提升 |
---|---|---|
RVO | 临时对象构造 + 拷贝/移动构造 + 析构 | 减少2-3次构造/析构调用(如大对象) |
NRVO | 具名对象拷贝/移动构造 + 析构 | 减少1-2次构造/析构调用(如复杂类型) |
8 补充说明
-
标准要求
- RVO(URVO):仅在 C++17 后对纯右值(如
return Obj{};
)强制优化,C++11/14 允许但不强制。 - NRVO:所有 C++ 版本中均为编译器可选优化,即使 C++17 也不强制。
- RVO(URVO):仅在 C++17 后对纯右值(如
-
术语澄清
- RVO 广义上包含 URVO 和 NRVO,但狭义场景中常特指 URVO(匿名临时对象优化)。
- URVO 是 C++17 强制优化的唯一场景,需明确标注为“未具名返回值优化”。
-
失败场景补充
- RVO 失败:返回类型与临时对象类型不严格匹配(需隐式转换)。
- NRVO 失败:多分支返回不同对象、显式
std::move
操作、对象被外部引用绑定等。
-
标准参考
-
C++17 标准 [class.copy.elision]/1:
When certain criteria are met, an implementation is required to omit the copy/move operation […] This elision of copy/move operations is called copy elision.
-
C++11 标准 [class.copy]/31:
This elision is permitted in the following circumstances […] when a temporary class object is copied/moved by a return statement.
9 总结
- RVO:针对匿名临时对象,强制优化(C++11后),适用于直接返回表达式结果的场景。
- NRVO:针对具名变量,依赖编译器实现,需满足所有返回路径一致性。
- 通用建议:优先设计无分支的返回逻辑,避免使用
std::move
,以充分利用编译器优化。 - 移动语义的兼容性:RVO优先于移动语义,但移动构造函数仍可能被调用(如返回右值)。
- 编译器差异:不同编译器对RVO的实现策略可能不同,需通过实际测试验证。
- 性能影响:RVO可显著减少内存分配和释放开销,但对简单类型(如
int
)优化效果有限。
相关文章:
【C/C++】C++返回值优化:RVO与NRVO全解析
文章目录 C返回值优化:RVO与NRVO全解析1 简介2 RVO vs NRVO3 触发条件4 底层机制5 应用场景6 验证与限制7 性能影响8 补充说明9 总结 C返回值优化:RVO与NRVO全解析 返回值优化(Return Value Optimization, RVO)是编译器通过消除临…...
使用 Kaniko来构建镜像
使用 Kaniko来构建镜像 Kaniko 是一种专注于容器镜像构建的开源工具,其核心设计理念与 Docker 存在显著差异。以下从功能定位、技术实现和适用场景三方面进行对比分析: 一、Kaniko 的核心特性 无需 Docker 守护进程 Kaniko 直接在容器或 Kubernetes 集…...
2025.05.17淘天机考笔试真题第三题
📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 03. 奇偶平衡树分割问题 问题描述 K小姐是一位园林设计师,她设计了一个由多个花坛组成的树形公园。每个花坛中种植了不同数量的花…...
history模式:让URL更美观
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 🍚 蓝桥云课签约作者、…...
算法:分治法
实验内容 在一个2kⅹ2k个方格组成的棋盘中,若恰有一个方格与其他方格不同,则称该方格为特殊方格,且称该棋盘为一特殊棋盘。 显然,特殊方格出现的位置有4k 种情况,即k>0,有4k 种不同的特殊棋盘 棋盘覆盖:…...
豆粕ETF投资逻辑整理归纳-20250511
目录 一、什么是豆粕 基本概念 豆粕上游生产国 豆粕下游消耗方 二、豆粕ETF 概念 策略 展期操作 超额收益 行情波动 豆粕资产的低相关性 三、展期收益 Contango升水结构和Backwardation贴水结构 豆粕的贴水逻辑 还有哪些品种拥有长期的展期收益 四、其他相关信…...
使用 Python 连接 Oracle 23ai 数据库完整指南
方法一:使用 oracledb 官方驱动(推荐) Oracle 官方维护的 oracledb 驱动(原 cx_Oracle)是最新推荐方案,支持 Thin/Thick 两种模式。 1. 环境准备 pip install oracledb2. 完整示例代码 import oracledb import getpass from typing import Unionclass Oracle23aiConn…...
构建集成差异化灵巧手和先进机器人控制技术的自动化系统
介绍程序 1.流程分析 通过流程分析审查应用机器人自动化的可行性。 2.系统设计 选择合适的机器人(机械臂、夹持器、视觉系统等),并通过详细的任务分析设计最佳系统。 3.内部测试 建立内部测试平台并解决任何问题。 4.现场测试 现场设…...
题单:汉诺塔问题
题目描述 如下图所示,设有 nn 个大小不等的中空圆盘,按照从小到大的顺序叠套在立柱 A 上,另有两根立柱 B 和 C 。 现在要求把全部圆盘从 A 柱(称为源柱)移到 C 柱(称为目标柱),移动…...
Unable to get end effector tips from jmg
这个错误信息表明在使用MoveIt2时,moveit_visual_tools无法从关节模型组(Joint Model Group,简称JMG)中获取末端执行器(End Effector,简称EE)的尖端信息。这通常是因为配置文件中缺少相关信息&a…...
flutter flutter run 运行项目卡在Running Gradle task ‘assembleDebug‘...
flutter run --verbose在运行flutter run 可以看到是卡在哪一步 最重要的就是自己查看日志,具体哪一步有问题flutter run --verbose使用这个,运行了项目会将错误信息放在控制台 可能原因 静态资源问题如果:图片、字体文件等没有在pubspec.yam…...
STM32烧录程序正常,但是运行异常
一、硬件配置问题 BOOT引脚设置错误 STM32的启动模式由BOOT0和BOOT1引脚决定。若设置为从RAM启动(BOOT01,BOOT10),程序在掉电后无法保存,导致复位后无法正常运行。应确保BOOT00(从Flash启动)15。…...
TTS:F5-TTS 带有 ConvNeXt V2 的扩散变换器
1,项目简介 F5-TTS 于英文生成领域表现卓越,发音标准程度在本次评测软件中独占鳌头。再者,官方预设的多角色生成模式独具匠心,能够配置多个角色,一次性为多角色、多情绪生成对话式语音,别出心裁。 最低配置…...
ecmascript 第6版特性 ECMA-262 ES6
https://blog.csdn.net/zlpzlpzyd/article/details/146125018 在之前写的文章基础上,ES6在export和import的基础外,还有如下特性 特性说明let/const块级作用域变量声明>箭头函数Promise异步编程...
2024 山东省ccpc省赛
目录 I(签到) 题目简述: 思路: 代码: A(二分答案) 题目简述: 思路: 代码: K(构造) 题目: 思路: 代…...
角点特征:从传统算法到深度学习算法演进
1 概述 图像特征是用来描述和分析图像内容的关键属性,通常包括颜色、纹理和形状等信息。颜色特征能够反映图像中不同颜色的分布,常通过 RGB 值或色彩直方图表示。纹理特征则关注图像表面的结构和细节,例如通过灰度共生矩阵或局部二值模式&…...
免费代理IP服务有哪些隐患?如何安全使用?
代理IP已经成为互联网众多用户日常在线活动中不可或缺的一部分。无论是为了保护个人隐私、突破地理限制,还是用于数据抓取、广告投放等商业用途,代理IP都扮演着关键角色。然而,市场上存在大量的免费代理IP服务,尽管它们看起来颇具…...
深入了解 VPC 端点类型 – 网关与接口
什么是VPC 端点 VPC 端点(VPC Endpoint)是 Amazon Web Services (AWS) 提供的一种服务,允许用户在 Virtual Private Cloud (VPC) 内部安全地访问 AWS 服务,而无需通过公共互联网。VPC 端点通过私有连接将 VPC 与 AWS 服务直接连接…...
Android屏幕采集编码打包推送RTMP技术详解:从开发到优化与应用
在现代移动应用中,屏幕采集已成为一个广泛使用的功能,尤其是在实时直播、视频会议、远程教育、游戏录制等场景中,屏幕采集技术的需求不断增长。Android 平台为开发者提供了 MediaProjection API,这使得屏幕录制和采集变得更加简单…...
信息系统项目管理师高级-软考高项案例分析备考指南(2023年案例分析)
个人笔记整理---仅供参考 计算题 案例分析里的计算题就是进度、挣值分析、预测技术。主要考査的知识点有:找关键路径、求总工期、自由时差、总时差、进度压缩资源平滑、挣值计算、预测计算。计算题是一定要拿下的,做计算题要保持头脑清晰,认真读题把PV、…...
全栈项目搭建指南:Nuxt.js + Node.js + MongoDB
全栈项目搭建指南:Nuxt.js Node.js MongoDB 一、项目概述 我们将构建一个完整的全栈应用,包含: 前端:Nuxt.js (SSR渲染)后端:Node.js (Express/Koa框架)数据库:MongoDB后台管理系统:集成在同…...
Linux:基础IO
一:理解文件 1-1 狭义理解 文件存储在磁盘中,由于磁盘是永久性存储介质,因此文件在磁盘上的存储是永久性的;磁盘也是外设,因此磁盘上对文件的所有操作本质是对外设的输入和输出 1-2 广义理解 Linux下一切皆文件&am…...
MySQL 索引优化以及慢查询优化
在数据库性能优化中,索引优化和慢查询优化是两个关键环节。合理使用索引可以显著提高查询效率,而识别和优化慢查询则能提升整体数据库性能。本文将详细介绍MySQL索引优化和慢查询优化的方法和最佳实践。 一、MySQL 索引优化 1.1 索引的基本概念 索引是…...
Leaflet使用SVG创建动态Legend
接前一篇文章,前一篇文章我们使用 SVG 创建了带有动态文字的图标,今天再看看怎样在地图上根据动态图标生成相关的legend,当然这里也还是使用了 SVG 来生成相关颜色的 legend。 看下面的代码,生成了一个 svg 节点,其中…...
使用 Vue Tour 封装一个统一的页面引导组件
项目开发过程中需要实现用户引导功能,经过调研发现一个好用的 Vue 插件 vue-tour,今天就来分享一下我是如何基于 vue-tour 封装一个统一的引导组件,方便后续在多个页面复用的。 📦 第一步:安装 vue-tour 插件 首先安装…...
OpenResty 深度解析:构建高性能 Web 服务的终极方案
引言 openresty是什么?在我个人对它的理解来看相当于嵌入了lua的nginx; 我们在nginx中嵌入lua是为了不需要再重新编译,我们只需要重新修改lua脚本,随后重启即可; 一.lua指令序列 我们分别从初始化阶段,重写/访问阶段,内容阶段,日志…...
赋能企业级移动应用 CFCA FIDO+提升安全与体验
移动办公与移动金融为企业有效提升业务丰富性、执行便捷性。与此同时,“安全”始终是移动办公与移动金融都绕不开的话题。随着信息安全技术的发展,企业级移动应用中安全与便捷不再是两难的抉择。 中金金融认证中心(CFCA)作为经国…...
Redis 数据类型与操作完全指南
Redis 是一个开源的、内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。与传统的关系型数据库不同,Redis 提供了丰富的数据类型和灵活的操作方式,这使得它能够高效地解决各种不同场景下的数据存储和处理问题。本文将全面介绍 R…...
ArrayList-集合使用
自动扩容,集合的长度可以变化,而数组长度不变,集合更加灵活。 集合只能存引用数据类型,不能直接存基本数据类型,除非包装 ArrayList会拿[]展示数据...
深入解析Spring Boot与Redis集成:高效缓存实践
深入解析Spring Boot与Redis集成:高效缓存实践 引言 在现代Web应用开发中,缓存技术是提升系统性能的重要手段之一。Redis作为一种高性能的键值存储数据库,广泛应用于缓存、会话管理和消息队列等场景。本文将详细介绍如何在Spring Boot项目中…...
8天Python从入门到精通【itheima】-11~13
目录 11节-PyCharm的安装和基础使用: 1.第三方IDE(集成开发工具) 2.PyCharm的所属——jetbrains公司 3.进入jetbrains的官网,搜索下载【官网自带中文,太友好了,爱你(づ ̄3&#x…...
day33-网络编程
1. 网络编程入门 1.1 网络编程概述 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统…...
CMake基础及操作笔记
CMake 基础与操作:从入门到精通 前言 CMake 是一个功能强大、跨平台的构建工具,广泛用于 C 项目管理。它通过简洁的配置文件(CMakeLists.txt)描述编译过程,生成适用于不同平台的构建脚本(如 Makefile 或 …...
使用lvm进行磁盘分区
使用lvm进行磁盘分区 目的: 使用/dev/vdb创建一个5g的逻辑卷挂载到/mnt/lvmtest 前提: /dev/vdb是一块干净的空磁盘,数据会被清空!!! 1. 创建物理卷(PV): pvcreate /dev/sdb2. 验证…...
Java的线程通信机制是怎样的呢?
核心观点:线程通信本质是状态同步与数据传递的协同控制 (类比测试团队协作:如同测试用例执行需要同步进度,测试数据需要跨线程传递) 一、基础通信机制(附测试验证方法) 1. 共享内存(最常用但最危险) // 测试典型场景:多线程统计测试用例通过率 public class Share…...
线性回归策略
一种基于ATR(平均真实范围)、线性回归和布林带的交易策略。以下是对该策略的全面总结和分析: 交易逻辑思路 1. 过滤条件: - 集合竞价过滤:在每个交易日的开盘阶段,过滤掉集合竞价产生的异常数据。 - 价格异常过滤:排除当天开盘价与最高价或最低价相同的情况,这…...
Sparse4D运行笔记
Sparse4D有三个版本,其中V1和V2版本的官方文档中环境依赖写得比较模糊且依赖库有版本冲突。 1. Sparse4D V1 创建环境 conda create sparse4dv1 python3.8 激活环境 conda activate sparse4dv1 安装torch, torchvision, torchaudio pip install torch1.13.0c…...
Bitmap、Roaring Bitmap、HyperLogLog对比介绍
一、Bitmap(位图)概述 Bitmap 是一种用位(bit)来表示集合元素是否存在的数据结构。每个位代表一个元素的状态(0或1),非常节省空间且支持快速集合操作。 常见Bitmap类型: 普通Bitmap 最简单的位数组,适合元素范围固定且不稀疏的场景。例如,元素范围是0~1000,用1001…...
Rust 数据结构:HashMap
Rust 数据结构:HashMap Rust 数据结构:HashMap创建一个新的哈希映射HashMap::new()将元组变成哈希表 访问哈希映射中的值哈希映射和所有权更新哈希映射重写一个值仅当键不存在时才添加键和值基于旧值更新值 散列函数 Rust 数据结构:HashMap …...
Spring6学习及复习笔记
1、快速入门认识 通过编写xml配置文件来创建对象,读取bean标签的id值和class值来创建。 之后再通过对象调用相关的方法(这里实际上用到的是反射机制) 对象会存放到Map集合中 大致反射思路如下:(这里只是模拟&#x…...
开源语音-文本基础模型和全双工语音对话框架 Moshi 介绍
介绍 一、项目背景 Moshi是一种语音-文本基础模型和全双工语音对话框架。它使用了Mimi这一业界领先的流式神经音频编解码器。Mimi能够以完全流式处理的方式(80毫秒的延迟,即帧大小),将24千赫兹的音频信号压缩为12.5赫兹的表示形式…...
MATLAB学习笔记(六):MATLAB数学建模
MATLAB 是数学建模的强大工具,其丰富的函数库和可视化能力可以高效解决各类数学建模问题。以下是 MATLAB 数学建模的完整指南,涵盖建模流程、常用方法、代码示例及实际应用。 一、数学建模的基本流程 问题分析 • 明确目标(预测、优化、分类等…...
博客打卡-求解流水线调度
题目如下: 有n个作业(编号为1~n)要在由两台机器M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工,然后在M2上加工。M1和M2加工作业i所需的时间分别为ai和bi(1≤i≤n)。 流水…...
【Ragflow】22.RagflowPlus(v0.3.0):用户会话管理/文件类型拓展/诸多优化更新
概述 在历经三周的阶段性开发后,RagflowPlus顺利完成既定计划,正式发布v0.3.0版本。 开源地址:https://github.com/zstar1003/ragflow-plus 新功能 1. 用户会话管理 在后台管理系统中,新增用户会话管理菜单。在此菜单中&…...
深度学习中ONNX格式的模型文件
一、模型部署的核心步骤 模型部署的完整流程通常分为以下阶段,用 “跨国旅行” 类比: 步骤类比解释技术细节1. 训练模型学会一门语言(如中文)用 PyTorch/TensorFlow 训练模型2. 导出为 ONNX翻译成国际通用语言(如英语…...
【机器人】复现 WMNav 具身导航 | 将VLM集成到世界模型中
WMNav 是由VLM视觉语言模型驱动的,基于世界模型的对象目标导航框架。 设计一种预测环境状态的记忆策略,采用在线好奇心价值图来量化存储,目标在世界模型预测的各种场景中出现的可能性。 本文分享WMNav复现和模型推理的过程~ 下…...
C++中析构函数不设为virtual导致内存泄漏示例
一、问题示例 #include <iostream> using namespace std;class Base { public:Base() { cout << "Base constructor\n"; }~Base() { cout << "Base destructor\n"; } // 不是 virtual };class Derived : public Base { public:Derived(…...
UDP--DDR--SFP,FPGA实现之模块梳理及AXI读写DDR读写上板测试
模块梳理介绍 在之前的几篇文章中,笔者详细介绍了整个项目的框架结构以及部分关键模块的实现细节。这些模块包括UDP协议栈、UDP指令监测、数据跨时钟域处理、DDR读写控制、内存读取控制以及DDR AXI控制器等。这些模块共同构成了项目的基础架构,每个模块…...
Slidev集成Chart.js:专业数据可视化演示文稿优化指南
引言:为何选择在Slidev中集成Chart.js? 在现代演示文稿中,高效的数据可视化对于清晰传达复杂信息至关重要。Slidev是一款灵活的开源演示文稿工具,基于Web技术构建,但在高级数据可视化方面存在一定局限。本文旨在提供一…...
动态规划(3)学习方法论:构建思维模型
引言 动态规划是算法领域中一个强大而优雅的解题方法,但对于许多学习者来说,它也是最难以掌握的算法范式之一。与贪心算法或分治法等直观的算法相比,动态规划往往需要更抽象的思维和更系统的学习方法。在前两篇文章中,我们介绍了动态规划的基础概念、原理以及问题建模与状…...