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

rust语言学习笔记Trait(十二)Sized、?Sized (大小限制)

Sized是 Rust 中一个极其特殊的标记 TraitMarker Trait它既没有方法也极少需要手动实现但却深刻地影响着 Rust 的类型系统、内存布局和 trait 对象的使用方式。1、什么是SizedSized的定义极其简单位于std::marker模块中pubtraitSized{}一个类型在‌编译期具有固定且已知的大小‌。Rust 中绝大多数类型都是Sized的包括所有基本类型、结构体、枚举、数组、元组等。如果一个类型的大小在编译期无法确定它就被称为‌动态大小类型DST, Dynamically Sized Type。典型的 DST 包括切片类型[T]字符串切片str不是strtrait 对象dyn Trait包含一个 DST 作为最后一个字段的结构体// 这些都是 DST无法直接使用lets:str*hello;// 编译错误size 未知letarr:[i32][1,2,3];// 编译错误size 未知letdyn_obj:dynDisplay...;// 编译错误size 未知由于 DST 的大小未知它们无法被放在栈上也不能作为函数参数按值传递。只能在‌指针后面‌使用它们比如str、[T]、Boxdyn Trait等。2、隐式 Sized 绑定Rust 的类型参数‌默认是Sized的‌。这意味着当你写一个泛型函数时编译器实际上帮你在内部添加了Sized约束// 你写的代码fnfooT(x:T){...}// 编译器实际看到的fnfooT:Sized(x:T){...}这种隐式绑定覆盖了以下场景泛型类型参数T泛型结构体/枚举中的字段impl Trait的返回类型3、 使用?Sized解除限制当你需要在泛型中接受 DST 时需要使用特殊语法?Sized意为T可以是 Sized 的也可以不是。// 解除 Sized 限制T 可以是 DSTfnbarT:?Sized(x:T){// x 是指针所以即使 T 是 DST 也没问题}?Sized只能在以下位置使用泛型类型参数T: ?Sized结构体泛型参数的最后一个字段struct ST: ?Sized { tail: T }‌不能‌在关联类型、trait 自身定义或函数返回值中使用。usestd::fmt::Debug;fnprint_testT:Debug?Sized(t:T){println!({:?},t);}fnmain(){print_test(ssss);print_test([2,5,6]);print_test(35);}4、标准库中的应用类型/模块应用方式说明BoxTimplT: ?Sized BoxTBox可以指向堆上的 DST如Box[i32]或Boxdyn Error。RcT/ArcTimplT: ?Sized RcT引用计数指针也可以指向 DST。std::fmt::Debugtrait Debug: ?Sized允许对str、[i32]等切片直接调用.fmt()。AsRefTimplT: ?Sized, U: ?Sized AsRefU for T许多转换逻辑需要处理不定长类型。5、Sized和?Sized的使用‌默认不动‌在绝大多数泛型编程中保持默认的Sized约束。这保证了类型可以按值传递、存储在栈上且性能最优。‌需要灵活性时用?Sized当你的函数接收的是‌引用‌T或‌智能指针‌BoxT且你希望它能通吃“具体类型”和“切片/Trait对象”时。典型签名fn fooT: ?Sized(x: T)。‌设计 Trait 时注意‌如果希望 Trait 能被用作dyn Trait不要给 Trait 本身加Sized约束。如果 Trait 中的某些方法依赖于静态大小如返回Self给该方法加where Self: Sized。理解Sized和?Sized的核心在于明白‌**Rust 默认追求静态确定的内存布局而?Sized是为了在必要时通过指针间接访问打破这一限制以支持多态和切片操作。
http://www.zskr.cn/news/1403767.html

相关文章:

  • 基于BLS熵与t-SNE的形状聚类:从网络熵到无监督分类的实践
  • 基于RSSI方差的室内Wi-Fi指纹定位优化算法VFDA详解
  • 基于Wasserstein GAN的工业协议智能模糊测试数据生成实战
  • n | 逆转上半场
  • 2026别错过!降AI率网站深度测评与推荐
  • 检查csv文件编码方式
  • Polars中导入excel文件
  • GPO算法:融合梯度下降与粒子群优化的大规模高维优化新方法
  • 戴森球计划工厂蓝图仓库:8000+优化布局的终极模块化解决方案
  • 移动目标防御有效性评估:基于系统攻击面与隐马尔可夫模型的量化分析
  • GEO板块负责人孙玉帅:以专业统筹驱动业务提质增效 - 奔跑123
  • 物理信息机器学习在交通流预测中的应用:融合流体力学与深度学习
  • 基于极值理论的概率最坏情况执行时间分析:从原理到TimeProbe工具实践
  • 免费Windows窗口编辑器:SRWE终极使用指南,轻松控制任意程序窗口
  • 告别误报烦恼:手把手教你用Fortify SCA 2023.2.0精准定位Java代码中的SQL注入漏洞
  • V模型驱动风电控制:从Simulink到STM32的DPC-PI算法工程化实践
  • SwiftMOS:基于直接视图转换的实时激光雷达运动物体分割算法
  • 大模型边缘部署新突破:混合精度与对数量化实现4比特以下高效压缩
  • 从99.77%到99.8%:PyTorch CNN在MNIST上的超参数调优与模型微调实战
  • Vidupe:如何利用智能视频指纹技术快速清理重复视频文件
  • DOP值仿真与几何布局优化:从理论到实践
  • 告别屏幕文字复制困境!用Text-Grab实现高效OCR识别的4种创新模式
  • ESMFold终极实战指南:5个高效预测蛋白质3D结构的专业方案
  • 专业显卡配置工具:NVIDIA Profile Inspector深度解析与实用指南
  • LocoGPT:基于Transformer的跨机器人运动控制策略实现
  • 全面战争MOD开发革命:用RPFM将工作效率提升300%的终极指南
  • 2023B卷,求最小步数
  • DownKyi哔哩下载姬:3步轻松免费下载B站高清视频的完整指南
  • 如何用BG3脚本扩展器彻底改变你的博德之门3游戏体验?
  • 动态目标跨镜无缝接力追踪技术——武警反恐防暴场景中的空间智能应用白皮书