面试题答案
一键面试String
类型动态管理容量方式
在Rust中,String
类型内部维护一个指向堆上内存的指针、长度(len
)和容量(capacity
)。当String
对象被创建时,其初始容量可能为0,随着数据的不断追加,当现有容量不足以容纳新的数据时,String
会自动重新分配内存。重新分配时,通常会分配比当前所需更多的空间,以减少后续重新分配的频率,这个过程涉及到内存的复制。
reserve
方法
reserve
方法用于预先分配额外的容量,以容纳指定数量的额外字节。它会确保字符串至少有足够的容量来存储当前内容加上指定的额外字节数。如果当前容量已经足够,此方法不会做任何事。如果需要重新分配内存,它会尝试分配一个合适的大小,可能会比所需的略大一些,以减少后续重新分配的次数。
示例:
let mut s = String::from("hello");
// 预留足够的容量以存储 " world"
s.reserve(6); // " world" 包含空格共6个字节
s.push_str(" world");
println!("{}", s);
reserve_exact
方法
reserve_exact
方法与reserve
类似,也是用于预先分配额外容量。但reserve_exact
会精确地分配所需的额外容量,不会多分配额外空间。如果当前容量加上指定的额外字节数超过了isize::MAX
,或者分配内存失败,会导致程序panic
。
示例:
let mut s = String::from("hello");
// 精确预留足够的容量以存储 " world"
s.reserve_exact(6);
s.push_str(" world");
println!("{}", s);
区别
- 分配策略:
reserve
可能会分配比所需略多的空间,以减少后续重新分配;reserve_exact
精确分配所需空间,不多分配。 - 错误处理:
reserve
不会因为分配失败而panic
,而reserve_exact
如果分配失败(如超过最大容量)会导致panic
。