You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Rust中的slice被称为DST?

为什么Rust中的Slice被称为DST?

Slice被称为DST(动态大小类型),核心原因是它的基础类型本身不携带编译期可确定的固定大小——这和你创建slice时知道它的实际长度是完全两码事。

  • 首先得区分「slice类型」和「我们实际使用的slice指针」:slice的原始类型是[T],这个类型在编译阶段没有固定大小。你没法直接声明一个let s: [i32];这样的栈变量,因为编译器根本不知道要给它分配多少内存空间。
  • 我们平时写代码时用的&[T](引用型slice)或者Box<[T]>(装箱slice)其实是胖指针,它们包含两个部分:指向数据起始位置的指针,以及slice的实际长度。这个长度是运行时确定的,并非类型本身的一部分。比如&[i32]不管指向的slice长度是2还是100,它的类型都是同一个,这和固定大小的数组[i32; 2]、[i32; 100]属于不同类型的情况完全不同。
  • 你创建slice时知道它的长度,只是说这个长度会在运行时被计算出来并存储到胖指针里,但slice的基础类型[T]依然是动态大小的——它的实际大小只有在运行时拿到具体实例的长度信息后才能确定。

举个直观的代码例子:

let arr = [1, 2, 3, 4];
let s = &arr[1..3]; // s的类型是&[i32],类型中不包含长度2的信息

// 下面这行代码会直接编译报错,因为[i32]是DST,无法直接在栈上实例化
// let invalid_slice: [i32];

内容的提问来源于stack exchange,提问作者Mandroid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 16:16:02