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

rust 动态分发 dyn

动态分发编译语言大多会遇到一个问题类型和大小是否能在编译器固定顾名思义动态分发即代表着运行时确定静态分发为编译期就已确定对于大小还好解决将值放在堆上即可解决数据类型大多语言都已支持泛型T以标准库自带的struct Vec来说是由泛型实现的一个宏切片使用时例如let language_cost vec![Rust, Python, Java];泛型体现为Vecstr每个切片的具体值为str这里暂称str类型为基础类型一个完整示例定义一个接口Animal分别定义两个结构体并分别实现Animal接口traitAnimal{fnmake_sound(self);}structDog;implAnimalforDog{fnmake_sound(self){println!(汪汪汪);}}structCat;implAnimalforCat{fnmake_sound(self){println!(喵喵喵);}}声明三种调用方法fndisplay_sound(animal:dynAnimal){animal.make_sound();}fndisplay_static_sounds(animal:implAnimal){animal.make_sound();}fndisplay_generic_soundsT:Animal(animal:T){animal.make_sound();}(这里先不关心所有权问题)display_static_sounds与display_generic_sounds是一样的内部实现都是一样的在main方法中都可以正常调用fnmain(){letdogDog;letcatCat;// display_sound(dog);// display_static_sounds(cat);// display_generic_sounds(cat);}dyn关键字display_sound方法中有一个dyn关键字各大技术博客都解释为动态分发也就在程序运行时才知道其调用的具体方法而不是将泛型或者trait的所有实现在编译器进行打包例如impl Animal程序中有两个struct均实现了该接口编译器在打包时将会生成多份代码执行也就意味着二进制包会大一点但是运行时就会很快使用dyn关键字定义 trait 对象本质上是告诉编译器 “这个类型需要走动态分发函数调用的具体目标要到运行时才能确定如果接触过c了解过vtable就会很好理解但我还是不太理解 。。。切片上面有说到Vec切片内部是使用泛型来实现的fnmain(){letdogDog;letcatCat;letanimals:VecimplAnimalvec![dog,cat];}这里会报个错impl Trait is not allowed in the type of variable bindingsimpl Trait is only allowed in arguments and return types of functions and methods类型impl Trait只能用于方法的形参和返回类型并且泛型在实例化后对于结构体这类非基础类型不是同一种类型虽然都实现了同一个traitdog ! cat切片使用方法fnmain(){letdogDog;letcatCat;letanimals:VecdynAnimalvec![dog,cat];foranimalinanimals{display_sound(animal);}}应用场景自我感觉rust中的dyn设计的不太优雅有些不符合编码预习惯预期dyn关键字大多数都是搭配trait/Box使用什么时候使用动态分配或静态分配这个要取决于自己对编程和项目的理解大多数场景下代码都可以用泛型方式去替代所以说用哪种并没有绝对的对错推荐动态跨模块 / 库的抽象当 trait 的实现者不在当前编译单元如第三方库无法通过泛型静态分发时动态分发是唯一选择。统一存储多类型实例、避免泛型代码膨胀时如数百种类型实现同一个 trait必须使用 dyn 标记 trait 对象需要存储 / 处理不同类型的 trait 实现者如Vecdyn Animal 混合Dog/Cat需要在运行时动态决定使用哪个类型如根据用户输入选择实例需要控制二进制体积避免泛型单态化导致的代码膨胀需要函数返回不同类型的 trait 实现者。推荐静态性能敏感的场景比如游戏引擎、高频计算的代码静态分发无运行时开销性能更优编译时即可确定类型比如工具类函数输入类型固定泛型静态分发更简洁、高效需要避免运行时错误静态分发在编译时检查类型动态分发可能因类型错误导致运行时 panic如 downcast 失败。类型固定、追求极致性能的场景代码简洁性优先且不需要异构集合 / 动态类型切换的场景。

相关文章:

rust 动态分发 dyn

动态分发 编译语言大多会遇到一个问题,类型和大小是否能在编译器固定? 顾名思义,动态分发即代表着运行时确定,静态分发为编译期就已确定 对于大小还好解决,将值放在堆上即可解决,数据类型大多语言都已支持泛…...

RuoYi-v4.5.0 文件下载接口的坑:从一次调试到发现任意文件读取漏洞

从调试到发现:RuoYi文件下载接口的路径拼接陷阱 那天下午,我正对着屏幕上的404错误发呆。项目里一个简单的文件下载功能突然罢工,而日志里只有一句冷冰冰的"File not found"。作为团队里负责这个模块的开发者,我不得不深…...

易语言数据库操作进阶:参数化查询、事务处理与通用组件封装

易语言数据库操作进阶:参数化查询、事务处理与通用组件封装一、学习目标与重点 💡学习目标:1. 理解SQL注入的危害与参数化查询的原理;2. 掌握内置Ado引擎与SQLite3的参数化查询方法(防止SQL注入)&#xff1…...

Qwen-Image-Lightning前端集成:JavaScript实现实时图像预览

Qwen-Image-Lightning前端集成:JavaScript实现实时图像预览 想象一下,你正在开发一个创意工具网站,用户输入一段文字描述,几秒钟后就能看到对应的图片慢慢“画”出来,整个过程流畅自然,还能看到生成进度。…...

保姆级教程:用Stream搞定iOS App抓包,从证书安装到数据查看一步不落

iOS应用数据抓包实战指南:从Stream配置到数据分析全解析 在移动应用开发和测试过程中,数据抓包是一项基础但至关重要的技能。无论是调试API接口、分析网络性能,还是排查数据异常,掌握专业的抓包技术都能显著提升工作效率。对于iOS…...

Apache HTTP Server 安全加固综合指南

好的,我们来聚焦于 Apache HTTP Server 的安全。这是一个非常广泛且重要的主题。我将为您提供一个结构化的、从基础到进阶的 Apache 安全加固指南,您可以将其视为一个“手动版”智能体的检查清单和操作手册。Apache HTTP Server 安全加固综合指南 一、 核…...

3大核心功能革新Apple Silicon Mac游戏体验:PlayCover全攻略

3大核心功能革新Apple Silicon Mac游戏体验:PlayCover全攻略 【免费下载链接】PlayCover Community fork of PlayCover 项目地址: https://gitcode.com/gh_mirrors/pl/PlayCover 还在为Apple Silicon Mac无法运行iOS游戏而困扰吗?PlayCover作为一…...

094华为黄大年茶思屋第3期·难题二:[高性能]数据库智能基数估计算法

华为黄大年茶思屋第3期难题二:[高性能]数据库智能基数估计算法 双思路解题方案:常规行业解法 本源动态原点解法,双框架对照,专家级可落地、可验证 核心亮点:直击数据库基数估计精度瓶颈,提供轻量化、自适应…...

墨语灵犀入门必看:Hunyuan-MT蒸馏版与全量版在古文翻译任务中的权衡

墨语灵犀入门必看:Hunyuan-MT蒸馏版与全量版在古文翻译任务中的权衡 1. 引言:当古典美学遇见AI翻译 想象一下这样的场景:你需要翻译一段深奥的古文,可能是唐诗宋词,也可能是先秦典籍。传统的翻译工具给你的是机械式的…...

093华为黄大年茶思屋第3期·难题一:AI大模型训练 – 多维度混合并行策略的自动搜索算法

华为黄大年茶思屋第3期难题一:AI大模型训练 – 多维度混合并行策略的自动搜索算法 双思路解题方案:常规行业解法 本源动态原点解法,双框架对照,专家级可落地、可验证 核心亮点:直击大模型并行策略搜索产业卡点&#x…...

智能微电网多目标优化:粒子群算法的完整数据运行与验证

智能微电网中利用粒子群算法实现多目标优化 有完整数据可运行 :智能微电网中对多目标问题的优化,采用粒子群的完美验证,有详细注释,可以借鉴 文件列表: C_buy2.txt C_sell2.txt C_sub2.txt fitnessEcoVir.m Load2.txt …...

Legacy iOS Kit终极指南:如何零成本复活旧iPhone与iPad设备

Legacy iOS Kit终极指南:如何零成本复活旧iPhone与iPad设备 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to downgrade/restore, save SHSH blobs, and jailbreak legacy iOS devices 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit L…...

嵌入式C++轻量工具库:零分配字符串与安全格式化

1. toolbox 库概述:面向嵌入式环境的轻量级通用工具集toolbox是一个专为资源受限嵌入式系统(尤其是 Arduino 风格平台)设计的通用工具库。它并非追求功能完备性,而是以确定性、低开销、内存可控为根本设计哲学,直面 MC…...

语音信号处理中的小波分解法降噪方法MATLAB例程

语音信号处理--降噪方法之小波分解法 MATLAB例程语音降噪这事儿,日常太刚需了——打电话时的背景杂音、录音里的环境噪音,都得想办法干掉。小波分解法算是语音降噪里的老牌选手了,比起傅里叶只能看全局频率,小波能同时抓时域和频域…...

Mbed OS下BLE鼠标HID服务开发指南

1. 项目概述Mbed BLE Mouse 是一个面向 Arduino 兼容开发板的蓝牙低功耗(BLE)人机接口设备(HID)库,专为运行 Mbed OS 的嵌入式平台设计。该库将具备 BLE 能力的微控制器(如 Arduino Nano 33 BLE、Nano 33 B…...

零门槛实战:Python百度搜索API从入门到精通

零门槛实战:Python百度搜索API从入门到精通 【免费下载链接】python-baidusearch 自己手写的百度搜索接口的封装,pip安装,支持命令行执行。Baidu Search unofficial API for Python with no external dependencies 项目地址: https://gitco…...

未来最有前景的行业及终身发展方向指南

未来最有前景的行业及终身发展方向指南根据最新行业趋势分析,以下5个行业不仅前景广阔,更适合作为终身职业发展方向,并附上具体实施步骤:一、人工智能与大模型应用为什么值得长期投入:国家"十五五"规划重点支…...

Python处理MDX词典数据实战:从解析到Excel导出完整流程

Python处理MDX词典数据实战:从解析到Excel导出完整流程 在语言学习和词典开发领域,MDX格式因其高效的压缩和检索能力成为主流词典存储格式之一。但对于需要批量分析或迁移数据的开发者而言,直接操作这种二进制文件始终是个技术门槛。本文将带…...

手把手教你用云测试平台搞定安卓/iOS/鸿蒙兼容性测试(含Testin/百度MTC实战)

云测试平台实战指南:零成本解决安卓/iOS/鸿蒙兼容性问题 当你的应用需要同时覆盖三大移动平台时,真机设备采购成本可能高达数十万元。去年我们团队上线一款社交应用时,仅购买主流测试设备就花掉了23万预算——直到发现云测试平台能以1/100的…...

25岁的Java工程师:我的AI转型之路,附完整学习路线与资料下载

一位Java开发者在AI大模型兴起后面临职业危机,通过博学谷的系统培训成功转型AI领域。经过6个月刻苦学习,在老师指导下克服数学基础薄弱等困难,最终获得月薪15K的AI工作机会。作者分享了自己的转型经历、完整学习路线和AI大模型资源&#xff0…...

SourceTree 合并提交实战:5分钟搞定零散提交的批量处理(附Cherry Pick技巧)

SourceTree高效提交管理:从零散提交到优雅合并的完整指南 在团队协作开发中,代码提交历史就像项目的日记本——杂乱无章的记录会让后续的维护和问题追踪变得异常困难。想象一下,当你需要回溯某个功能的开发过程时,面对几十个"…...

Anaconda3安装和安装pycharm(保姆级教程)

目录 一.安装Anaconda3 二.安装pycharm 三.设置配置(可选根据自己的习惯来) Anaconda3 与 PyCharm 介绍、安装及关系 Anaconda3 是一个集成了 Python 解释器、大量数据分析和机器学习常用库(如 numpy、pandas),还自带 conda 环境管理工具的…...

(理论篇)深入剖析认证崩溃——从弱口令到暴力破解

概述:在应用程序的安全防御体系中,身份认证是守卫系统大门的第一道关卡。这道关卡的失守,通常被称为“认证崩溃”。 攻击者通过利用认证或会话管理中的缺陷,能够成功破译密码、密钥或会话令牌,从而获得非授权访问权限。…...

RAW图像处理避坑指南:如何正确分离和组合RGGB四通道(Python版)

RAW图像处理避坑指南:如何正确分离和组合RGGB四通道(Python版) 第一次处理RAW图像时,我犯了一个低级错误——直接把RGGB四个通道当作普通的RGB图像来处理。结果生成的图像色彩完全错乱,红色变成了诡异的紫色&#xff0…...

ret2text Ctfhub

简单的栈溢出gets函数,v4,在ebp-0x70shiftF12先传入形参,因为是64位,可以查看是将sh写入rdi寄存器中,之后调用函数system将常量区的地址写入rdi寄存器中,之后对rdi进行寄存器间接寻址.rodata:字…...

CoPaw赋能物联网(IoT)后端开发:设备数据解析与告警规则生成

CoPaw赋能物联网(IoT)后端开发:设备数据解析与告警规则生成 1. 物联网开发的现实挑战 想象一下这样的场景:你刚接手一个大型物联网平台项目,需要接入上百种不同类型的设备。这些设备来自不同厂商,协议文档…...

Vue-Flow-Editor:用SVG魔法点亮你的流程图创作之旅

Vue-Flow-Editor:用SVG魔法点亮你的流程图创作之旅 【免费下载链接】vue-flow-editor Vue Svg 实现的flow可视化编辑器 项目地址: https://gitcode.com/gh_mirrors/vu/vue-flow-editor 想象一下,你正在设计一个复杂的业务流程,脑海中…...

windows下git使用教程2(gitee仓库与代码提交)

前序文章: windows下git使用教程1(安装与使用) 代码仓库gitee的使用 介绍了git的基础操作,这篇文章介绍一下远程仓库和代码提交的操作。 1.远程仓库 远程仓库是托管在网络服务器上的 Git 仓库,和你本地电脑上的 本…...

技术解密:LilToon卡通渲染着色器的模块化革命与跨平台实践指南

技术解密:LilToon卡通渲染着色器的模块化革命与跨平台实践指南 【免费下载链接】lilToon Feature-rich shaders for avatars 项目地址: https://gitcode.com/gh_mirrors/li/lilToon 在Unity实时渲染生态中,卡通渲染技术长期面临风格化与性能优化的…...

从知识概念预测到精准推送:构建下一代个性化习题推荐引擎

1. 为什么我们需要下一代习题推荐系统? 每次打开在线学习平台时,你是否遇到过这样的困扰:系统推荐的题目要么简单得像112,要么难到让你怀疑人生?更糟的是,反复出现的同类题型让你想摔键盘。这背后暴露的正是…...