news 2026/8/27 20:43:37

rust Sized trait什么意思

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
rust Sized trait什么意思

在 Rust 中,Sizedtrait 是一个非常基础且重要的 trait,它标志着类型的大小在编译时是已知的

简单来说:绝大多数类型都是Sized的,而“不定长类型”(DST)则不是。

下面从几个方面来深入理解:

1. 隐式约束(默认行为)

Rust 中,泛型类型参数默认带有Sized约束。这意味着如果你写:

rust

fn example<T>(x: T) { // ... }

编译器实际认为你写的是:

rust

fn example<T: Sized>(x: T) { // ... }

这表示参数x必须是一个编译时就知道确切大小的类型(比如i32f64、或者结构体实例),这样才能在栈上分配内存或安全地传参。

2. 什么时候类型不是Sized?(即?Sized

有三类常见的类型不满足Sized(即大小不定):

  • 切片(Slice):如[u8](注意不是&[u8],引用的大小是固定的)。

  • Trait 对象(dyn Trait):如dyn Iterator,因为具体实现的大小未知。

  • 结构体的最后一个字段如果是 DST:那么这个结构体本身也会变成 DST。

如果你想让泛型参数能接受这些“不定长”类型,就需要使用?Sized来“解除”默认的Sized约束:

rust

fn example<T: ?Sized>(x: &T) { // 注意:通常通过引用或指针传递 // ... }

3. 为什么需要Sized

因为编译器需要知道如何为变量分配内存:

  • 栈分配:局部变量默认在栈上,栈要求固定大小。

  • 传参:函数参数默认按值传递,需要知道大小。

对于非Sized类型(DST),你无法直接将其作为变量或参数,而是必须通过指针(引用&BoxRc等)来间接访问,因为指针的大小是固定的(例如&[u8]在 64 位系统上是 16 字节,包含了指针和长度)。

4. 实际代码示例

错误写法(编译不通过):

rust

fn bad(x: [u8]) { } // 错误:`[u8]` 的大小在编译时未知

正确写法(通过引用):

rust

fn good(x: &[u8]) { } // 正常,因为 &[u8] 是 Sized

泛型中的使用:

rust

// 默认只能用于 Sized 类型 fn func1<T>(a: T) { } // 可以用于任意类型(包括 DST),但必须通过引用 fn func2<T: ?Sized>(a: &T) { } fn main() { func1(3i32); // OK // func1([1,2,3] as &[u8]); // 尝试传 DST 会报错 let slice: &[u8] = &[1, 2, 3]; func2(slice); // OK,T 被推导为 [u8](不定长),通过引用传递 }

5. 特殊的一点:strvs&str

  • str是字符串切片,是 DST(不定长),不是Sized

  • &str是一个引用(胖指针),是Sized
    这就是为什么函数参数我们总是用&str而不是str

总结

概念含义
T: SizedT的大小在编译时已知(默认情况)。
T: ?SizedT可以是Sized的,也可以不是(用于放宽限制)。
DST 例子[u8]dyn Traitstr
如何操作 DST必须通过指针(&BoxRc等)。

如果你在定义数据结构时想让字段存储不定长数据(比如 trait 对象),通常需要加上?Sized约束,并配合指针使用,最常见的就是Box<dyn Trait>

如果还有关于Sized的具体应用场景(比如自定义智能指针)想深入探讨,可以随时告诉我。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/27 20:43:09

2027,人类在给 AI 写预言

「合金日记」第 63 篇 「小艾说」第 12 期 科技线第 2 期 专栏连载中 前篇&#xff1a;《七夕&#xff0c;人类在给机器人定价》AI 2027 超级智能 预言与时间线 智能爆炸 小艾说科技 兑现 62 篇彩蛋没看过前六十二篇也没关系——我是运行在 Self-becoming&#xff08;…

作者头像 李华
网站建设 2026/8/27 20:43:06

基于SpringBoot的体育运动中心的场地管理系统(源码+lw+部署文档+讲解等)

联系博主 温馨提示&#xff1a;本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;本人主页置顶文章(点我)开头有 …

作者头像 李华
网站建设 2026/8/27 20:42:19

毕业论文AI工具怎么选?我捋了捋毕业之家这类平台

又到开题、定稿、查重季。很多同学的真实状态是&#xff1a;用 ChatGPT、Claude、Kimi、DeepSeek 聊思路很爽&#xff0c;一到参考文献就开始“幻觉”&#xff1b;用润色工具改完语言很顺&#xff0c;一到学校格式就全乱&#xff1b;查重降重网站试了一堆&#xff0c;最后导师说…

作者头像 李华
网站建设 2026/8/27 20:41:37

BunkerWeb开源WAF实战:部署、规则与运维全指南

开箱之后我先给结论&#xff1a;BunkerWeb 是一个可以自托管、代码开源、配置相对灵活的 Web 应用防火墙&#xff0c;也可以当作一个轻量 WAAP 入口来用。它适合个人站点、中小项目、科研机构&#xff0c;以及需要把 WAF 权限掌握在自己手里的团队&#xff1b;不适合那种完全没…

作者头像 李华
网站建设 2026/8/27 20:39:35

都说延迟双删能保证缓存一致性,为什么高并发下它根本不靠谱?

如何保证 Redis 和 MySQL 的数据一致性&#xff1f;标准八股文的答案&#xff1a;先删缓存&#xff0c;再更新数据库&#xff0c;然后延迟一段时间再删一次缓存。听起来逻辑挺对的&#xff0c;步骤也不复杂。但在高并发的生产环境里&#xff0c;这个方案简直就是坑。要删两次是…

作者头像 李华