String 与 str

String 是在 Rust 标准库中的内容,是一个可变的字符串类型,本质是一个 u8 Vector

struct String {
    vec: Vec<u8>,
}

Q:为什么是 u8? A:String 以 utf-8 字符存储,这样可以节省内存。并不是所有 utf-8 字符都会占用到 char 的4个字节的存储空间。

Vec 拥有内存的所有权,因此可以对 String 进行修改。当 String 超出作用域后,内存即被回收。

// String
let s = String::from("hello world");
// &str
let world = &s[6..11];

以上代码的内存分布:

图的右边部分即为 str

Rust 在语言级别,只有一种字符串类型: strstr 是一个动态、不可变变量。如果 str 由 String 转换过来,存储在堆上,如果有静态字面量创建,存储在静态内存。

  • 动态:分配给 str 的内存不确定,“aaa”:3个字节;“bbbbb“:5个字节
  • 不可变:创建后无法修改

由于 str 大小是动态的,无法直接使用,通常使用的是 &str。&str 包括一个指针,和一个长度字段,其大小在编译期已知。 &str 对指向的 str 没有所有权,属于借用(borrow)关系,因此只读,无法修改。切片被丢弃后,不会执行任何操作。

Rust 编辑器会将 &String 解引用为 &str

在通过函数传递参数时,或者在循环中,如果使用String,会导致内存的重新分配,造成性能损耗。