理解:DST(Dynamically Sized Type)。根据 Dynamically Sized Types 的说明:DST 是在编译期无法确定内存大小(但在运行期需要是可以确定大小的)。由于 DST 无法在编译期确定大小,因此: 无法在栈上进行分配。 一般的,DST 无法作为一个值类型嵌入到其他的结构体中。(一般的结构体是 Sized 类型的) DST 可以作为结构体...
在Rust 中,str是一种字符串切片类型,但它本身是一个动态大小类型,无法直接使用。通常情况下,我们会通过&str或Box<str>等方式来引用str,因为str类型的数据在内存中具有变长特性,编译器无法在编译时确定其具体大小。 str的特点和用途 动态大小类型(DST) str是一种动态大小类型(Dynamically Sized Type,DST),即它的...
动态大小类型和Sizedtrait 因为Rust 需要知道例如应该为特定类型的值分配多少空间这样的信息其类型系统的一个特定的角落可能令人迷惑:这就是动态大小类型(dynamically sized types)的概念。这有时被称为 “DST” 或“unsized types”,这些类型允许我们处理只有在运行时才知道大小的类型。 让我们深入研究一个贯穿本书都...
然而,对于[i32],Rust没法在编译时明确这个变量需要多少内存,因而也没法在栈上分配内存,因而上例中的slice_1和slice_2实际上会编译失败。这样的变量称之为dynamically sized type,后续会讲到string slice和trait object也属于这个范畴。 因而,通常我们使用一个reference来指向一个Slice切片,让我们看下例 letslice_1: ...
因为Rust 需要知道例如应该为特定类型的值分配多少空间这样的信息其类型系统的一个特定的角落可能令人迷惑:这就是 动态大小类型(dynamically sized types)的概念。这有时被称为 “DST” 或“unsized types”,这些类型允许我们处理只有在运行时才知道大小的类型。 让我们深入研究一个贯穿本书都在使用的动态大小类型的...
当reference指向dynamically sized type时,Rust实际会使用到一个胖指针(fat pointer),其中包含: pointer (1 machine word): 指向实际被切片的数据。 length (1 machine word): 切片长度,即有多少个T(本例中T为i32)。 我们可以看下上述例子的内存分布图。
然而,对于[i32],Rust没法在编译时明确这个变量需要多少内存,因而也没法在栈上分配内存,因而上例中的slice_1和slice_2实际上会编译失败。这样的变量称之为dynamically sized type,后续会讲到string slice和trait object也属于这个范畴。 因而,通常我们使用一个reference来指向一个Slice切片,让我们看下例 ...
因为Rust 需要知道例如应该为特定类型的值分配多少空间这样的信息其类型系统的一个特定的角落可能令人迷惑:这就是动态大小类型(dynamically sized types)的概念。这有时被称为 “DST” 或“unsized types”,这些类型允许我们处理只有在运行时才知道大小的类型。
pub fn align_of_val<T: ?Sized>(val: &T) -> usize pub fn size_of_val<T: ?Sized>(val: &T) -> usize Slices and strings Where C has dynamically-sized arrays and NUL-terminated strings, Rust has the slice and str types. Pointers to these types are an (address, size) tuple, ma...
切片是动态大小类型(DST, Dynamically Sized Type),它们的胖指针包含数据指针和长度。 特征对象(Trait Object): 特征对象是实现了某个特征的类型的实例,它们的胖指针包含数据指针和指向虚表(vtable)的指针。 fn main() { let arr = [10, 20, 30, 40, 50]; ...