gpt4 book ai didi

string - 传递 `&str` 对 Rust 的性能不不利吗?

转载 作者:行者123 更新时间:2023-12-03 11:40:37 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Is it more conventional to pass-by-value or pass-by-reference when the method needs ownership of the value?

(1 个回答)


去年关闭。




一般建议接受&str而不是 String在 rust 。
假设我有几个函数和一个 String实例:

use std::collections::HashMap;

fn do_something_str(string: &str) {
let mut map = HashMap::new();
map.insert(string.to_owned() /* copying (expensive)? */, "value");
}

fn do_something_string(string: String) {
let mut map = HashMap::new();
map.insert(string /* moving (cheap)? */, "value");
}

fn main() {
let string = String::from("123");
do_something_str(&string);
do_something_string(string);
}
Playground
复制是否发生在 do_something_str()意味着它会更慢/更高的临时内存消耗?
PS。我知道我不必调用 .to_owned()明确的,以下也将起作用:
fn do_something_str(string: &str) {
let mut map = HashMap::new();
map.insert(string /* copying (expensive)? */, "value");
}
但是由于哈希图拥有 key ,我相信它会隐式地克隆它。请纠正我,如果我错了。

最佳答案

In general it's suggested to accept &str instead of String in Rust.


不完全的。一般的智慧是接受 &str而不是 &String .也就是说,当您已经打算对引用进行操作时,更通用的类型被认为更好。
如果您需要拥有的 String ,实际上只传递引用以立即克隆它是浪费的。接受 String首先将选择权留给调用者:如果他们需要为自己保留字符串的副本,他们可以 clone() .否则,调用者只需移动 String进入 HashMap 并且不涉及克隆。

But since a hashmap owns keys i believe it will clone it implicitly. Please correct me, if i'm wrong.

HashMap插入时不克隆。这将需要 Clone特征绑定(bind)在 HashMap . HashMap<&str, T>仍会“拥有” key ,但在这种情况下, key 是 &str ,而不是其拥有的等价物 ( String)。当然,这会阻止 HashMap避免超过键引用的字符串。以下示例未通过借用检查:
use std::collections::HashMap;

fn main() {
let mut map: HashMap<&str, ()> = HashMap::new();
{
let key = String::from("foo");
map.insert(&key, ()); // error[E0597]: `key` does not live long enough
}
println!("{:?}", map.get("foo"));
}

关于string - 传递 `&str` 对 Rust 的性能不不利吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66240527/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com