我注意到我经常需要在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和它的指针