Rust 的 String::from( "literal" ) 会复制所有字符串数据吗?



我注意到我经常需要在Rust中执行String::from("mydummystring")。对from()的调用是否最终创建了字符串数据的完整副本?看来这将是一个主要的性能问题。

是的,From<&str>String工作,通过创建一个新的堆分配缓冲区,并从原始片复制数据到它。

似乎这将是一个主要的性能问题。

可能比你想象的要少。复制一个字节块通常非常快。您应该对代码进行基准测试,以了解复制是否是瓶颈。即使复制很慢,大多数重要的程序也可能会一些复制字符串;你不能永远不复制任何东西。

尽管如此,如果有很多不必要的复制在进行,这对你的设计来说是个问题,Rust提供了很多其他的选择。String不是Rust唯一的字符串类型,甚至不是最常用的;如果不需要复制字符串,通常可以使用&str借用它们,使用Rc<str>共享所有权,使用Cow<str>将所有权决定推迟到运行时,甚至可以使用string-cache这样的字符串实习库。在Rust中,值的所有权和复制都在的控制之下,实际上比大多数其他语言都要多。最终,由您来选择哪种类型的所有权对程序中的字符串最有意义。 引用

  • Rust's的' String '和' str '有什么区别?
  • 用字符串存储UTF-8编码的文本(TRPL第8.2章)
  • 在不同的集合中安全有效地使用String和它的指针

最新更新