Rust静态sized类型和动态sized类型

1,902 阅读1分钟

变量是标识符(ID);

一切皆有类型

Rust 语言是强类型语言,所有变量都对应存在一个类型值。

静态sized类型


对于 Rust 编译器而言,所有类型必须是静态sized类型

  1. 实现Sized trait的类型(编译时已知使用内存大小的类型);
  2. Sized trait 是 std::marker 模块中的四大特殊 trait 之一;

动态sized类型(DST)

绝大多数情况下,Rust 编译器认为类型必须具有静态已知的Size大小,但是并不总是这样。

有一类特殊的类型:动态sized类型(DST),DST类型不是 Rust 一等公民类型,必须通过指针实例化。

  1. 动态sized类型:仅在运行时知道的sized大小的类型、简称DST (dynamically sized type)
  2. 动态sized类型有: strSlicestrait objects、最后一个字段是动态sized类型的结构体;
  3. 指向动态sized类型的指针是胖指针(占用的内存大小是和常规指针的两倍);
  • trait 对象是实现指定trait的类型,trait 对象必须通过胖指针标记,trait 对象胖指针包含一个指向trait对象的常规指针和一个 vtable Pointervtable Pointer 代表trait 对象的运行时sized;
  • 切片( slice ) 是数据视图,比如是某个数组或Vec中的部分或全部数据的视图。切片( slice ) 同样需要胖指针切片( slice )胖指针包含切片指针(slice pointer)辅助信息指针(视图中数据元素个数);