rust中的字符串

关于这个记录

最近在学rust,参考的是RUST程序设计语言这本书,学到4.3小节时,对rust中的字符串感到疑惑,翻阅其他资料和帖子后好像理解了些,故做此记录,若有错误还行指出。

以一个例子说明

1
let s = "hello"

在rust中,str是唯一定义在 Rust 语言特性中的字符串str在rust中为string slice,即字符串切片,它是符合UTF-8规范的一串[u8]数据,在rust中切片slice代表类型为T的元素组成的序列,写作[T],是一种DST(dynamically sized types,动态大小类型),其不能被直接使用的,而是需要以切片引用的方式来使用。
以上面的这段代码为例,字符串"hello"即为str,它被硬编码进可执行程序的数据部分,程序执行时它被存储在只读数据区,表示字符串的实际内容,而"hello"的字面值类型则为&'static str,他是一个胖指针,包含指向该str数据的指针以及长度信息。
此外,rust中由字符串字面值赋值的变量的类型会被默认转换为&str,因此在这段代码中变量s的类型为&strs被存储在栈区中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
高地址
+-------------------+
| 栈区 | <- s 存储在栈区(胖指针:指针 + 长度)
+-------------------+
| 堆区 | <- 动态分配的内存
+-------------------+
| BSS段 | <- 未初始化数据区
+-------------------+
| 已初始化数据区 | <- 已初始化数据区
+-------------------+
| 只读数据区 | <- "hello" 存储在只读数据区
+-------------------+
| 代码区 | <- 只读的机器指令
+-------------------+
低地址

参考

  1. RUST程序设计语言
  2. Rust语言圣经
  3. 一文讲清楚 Rust 字符串: str &str String Box<str>