MST

星途 面试题库

面试题:Rust字符串容量管理基础策略

在Rust中,`String`类型是如何动态管理其容量的?请举例说明`reserve`和`reserve_exact`方法在字符串容量管理中的作用及区别。
50.1万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

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