内存管理区别
String
:
- 可变性:
String
是可变的,它拥有数据的所有权。这意味着它在堆上分配内存,并且其大小在运行时可以改变。
- 内存管理:当
String
离开作用域时,Rust的所有权系统会自动释放其占用的堆内存。例如:
{
let s = String::from("hello");
// s 在此处拥有堆上"hello"字符串的所有权
}
// s 离开作用域,其占用的堆内存被释放
&str
:
- 不可变性:
&str
是字符串切片,是不可变的引用类型。它通常指向String
或字符串字面量的一部分。
- 内存管理:它本身不拥有数据的所有权,只是借用数据。它的大小在编译时就已知,因为它只是一个指向数据的指针和长度。例如:
let s = String::from("hello");
let slice: &str = &s[0..2];
// slice 借用了 s 的一部分,不拥有数据所有权
类型转换及内存变化
&str
转 String
:
- 可以使用
String::from
或to_string
方法。例如:
let s1: &str = "world";
let s2 = String::from(s1);
// 或者 let s2 = s1.to_string();
- 内存变化:
&str
本身不拥有数据所有权,当转换为String
时,会在堆上分配新的内存来存储字符串数据,新的String
对象拥有这些数据的所有权。
String
转 &str
:
let s = String::from("rust");
let slice: &str = &s;
- 内存变化:没有新的内存分配,
&str
切片只是借用了String
已有的数据,指向String
在堆上存储的数据。如果要获取String
部分内容的切片,例如let slice: &str = &s[1..3];
,同样没有新内存分配,只是切片指向String
堆内存中的部分数据。