MST

星途 面试题库

面试题:Rust函数生命周期在性能调优中的基础应用

假设有一个Rust函数,接收两个字符串切片作为参数,并返回一个新的字符串切片,该切片是两个输入切片的拼接。请实现这个函数,并说明如何通过合理的生命周期标注来避免编译错误以及可能带来的性能提升点。
48.3万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
fn concatenate_strings(s1: &str, s2: &str) -> String {
    s1.to_owned() + s2
}

生命周期标注说明

  1. 不需要显式生命周期标注:在这个函数中,返回值类型是String,而不是&strString是一个拥有所有权的值,它的生命周期与函数调用所在的作用域相关,而不是依赖于输入的&str切片的生命周期。因此,不需要进行显式的生命周期标注,Rust编译器能够自动推断出正确的生命周期关系。
  2. 如果返回&str的情况:如果函数要返回&str,则需要显式标注生命周期。例如:
fn concatenate_strings<'a>(s1: &'a str, s2: &'a str) -> &'a str {
    // 以下代码无法直接实现,因为无法在栈上创建一个新的`&str`包含拼接内容
    // 仅为了展示生命周期标注
    todo!()
}

在这种情况下,标注<'a>表示两个输入切片s1s2以及返回的切片都具有相同的生命周期'a

性能提升点

  1. 使用String::with_capacity:可以预先计算拼接后字符串的长度,使用with_capacity方法初始化一个具有足够容量的String,以减少重新分配内存的次数。
fn concatenate_strings(s1: &str, s2: &str) -> String {
    let mut result = String::with_capacity(s1.len() + s2.len());
    result.push_str(s1);
    result.push_str(s2);
    result
}
  1. 避免不必要的复制:由于+操作符会将&str转换为String,在性能敏感的场景下,如果可以直接操作&str,尽量避免这种转换。但在本题要求拼接返回新字符串的情况下,使用push_str方法可以直接操作&str,相对+操作符减少了一次不必要的String转换。