为何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
相关产品推荐
相关产品推荐

