gpt4 book ai didi

rust - 引用和移动与复制

转载 作者:行者123 更新时间:2023-12-02 18:22:08 25 4
gpt4 key购买 nike

我正在阅读 Rust 书的第 4 章,来自 Python 背景。

让我有点困惑的是这不能编译:

fn do_something(s3: String) {
println!("{}", s3);
}

fn main() {
let s = String::from("Hello");
do_something(s);
println!("{}", s);
}

(这是不应该的,因为 s 在函数调用中被移动了),但是这样做:

fn do_something(s3: &String) {
println!("{}", s3);
}

fn main() {
let s1 = String::from("Hello");
let s2 = &s1;
do_something(s2);
println!("{}", s2);
}

如果我理解正确的话,这是因为 s1 已经是一个指针,所以 s2 是一个指向(堆栈分配的)指针的指针(好吧,一个引用)。因此,s2 在函数调用中被复制而不是被移动。是这样吗?上面和这个一样吗?

fn main() {
let a = 5;
let b = &a;
do_something(b);
println!("{}", b);
}

最佳答案

fn main() {
let s1 = String::from("Hello");
let s2 = &s1;
do_something(s2);
println!("{}", s2);
}

这是有效的,因为 references are Copy . s2是复制的,不是移动的,调用do_something后可以继续使用。


Is the above the same as this?

fn main() {
let a = 5;
let b = &a;
do_something(b);
println!("{}", b);
}

是的,是的。 as1 是否为 Copy 并不重要,只有 bs2 是。


I guess my question is, are they Copy because they are always pointers to stack-allocated data?

所有共享引用都是复制,因为一揽子实现:

impl<'_, T> Copy for &'_ T
where
T: ?Sized,

引用指向堆栈或堆或 .data 部分或其他任何地方都无关紧要。引用是字大小的小值,复制它们既方便又高效,因此 Rust 使它们成为Copy

这是通常的衡量标准:复制是否有效? String 不是Copy,因为克隆它们是一项昂贵的 O(n) 操作。 &str 作为引用, Copy 因为复制指针很便宜。

(当然,这不是唯一的指标。有些类型不是Copy,因为它们在逻辑上是唯一的。例如,Box 也只是一个指针,但它是一个拥有的类型,而不是共享引用。)

关于rust - 引用和移动与复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70761024/

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