引用和移动与复制
References and move vs. copy
我正在阅读 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);
}
是的,是的。 a
或 s1
是 Copy
无关紧要,只有 b
或 s2
是。
I guess my question is, are they Copy
because they are always pointers to stack-allocated data?
所有共享引用都是 Copy
因为一揽子实施:
impl<'_, T> Copy for &'_ T
where
T: ?Sized,
引用指向、堆栈或堆或 .data
部分或其他任何地方都无关紧要。引用是字大小的小值,复制它们既方便又高效,因此 Rust 将它们设为 Copy
.
这是通常的衡量标准:复制是否有效? String
不是 Copy
,因为克隆它们是一项昂贵的 O(n) 操作。 &str
s 是引用,是 Copy
因为复制指针很便宜。
(当然,这不是唯一的指标。有些类型不是 Copy
,因为它们在逻辑上是唯一的。例如,Box
也只是一个指针,但它是一个拥有的类型,不是共享参考。)
我正在阅读 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); }
是的,是的。 a
或 s1
是 Copy
无关紧要,只有 b
或 s2
是。
I guess my question is, are they
Copy
because they are always pointers to stack-allocated data?
所有共享引用都是 Copy
因为一揽子实施:
impl<'_, T> Copy for &'_ T where T: ?Sized,
引用指向、堆栈或堆或 .data
部分或其他任何地方都无关紧要。引用是字大小的小值,复制它们既方便又高效,因此 Rust 将它们设为 Copy
.
这是通常的衡量标准:复制是否有效? String
不是 Copy
,因为克隆它们是一项昂贵的 O(n) 操作。 &str
s 是引用,是 Copy
因为复制指针很便宜。
(当然,这不是唯一的指标。有些类型不是 Copy
,因为它们在逻辑上是唯一的。例如,Box
也只是一个指针,但它是一个拥有的类型,不是共享参考。)