数组是否在移动时被复制?
Are arrays copied on move?
当数组从 get_array()
函数返回(移动)时,是否正在复制元素?
fn get_array() -> [u8; 4] {
let a = [0, 1, 2, 3];
let mut b = a; // a move here produces the array to be copied over
b[2] = 10;
a
}
fn main() {
let a = get_array();
println!("{:?}", a);
}
你应该编写你的程序,就好像所有的移动都作为破坏性的按位复制。然而,这并不总是会发生,当不需要实际复制时,各种优化可以改变这种行为。例如:
fn foo() {
let x = bar();
println!("{}", x);
}
fn bar() -> [u8, 1024] {
let x = [1; 1024];
x
}
在此示例中,(概念上)当 bar()
[=28] 时,函数 bar()
中的 x
移动到函数 foo()
中的 x
=].
但实际上,如果函数是内联的,则根本不会发生移动。如果您对发生的事情感到好奇,请查看 godbolt.org 以查看发出的程序集。
此外,一如既往,如果您担心的是性能原因,请先尝试并进行基准测试,您可能会对 rustc/LLVM 能够执行的某些优化感到惊讶。
当数组从 get_array()
函数返回(移动)时,是否正在复制元素?
fn get_array() -> [u8; 4] {
let a = [0, 1, 2, 3];
let mut b = a; // a move here produces the array to be copied over
b[2] = 10;
a
}
fn main() {
let a = get_array();
println!("{:?}", a);
}
你应该编写你的程序,就好像所有的移动都作为破坏性的按位复制。然而,这并不总是会发生,当不需要实际复制时,各种优化可以改变这种行为。例如:
fn foo() {
let x = bar();
println!("{}", x);
}
fn bar() -> [u8, 1024] {
let x = [1; 1024];
x
}
在此示例中,(概念上)当 bar()
[=28] 时,函数 bar()
中的 x
移动到函数 foo()
中的 x
=].
但实际上,如果函数是内联的,则根本不会发生移动。如果您对发生的事情感到好奇,请查看 godbolt.org 以查看发出的程序集。
此外,一如既往,如果您担心的是性能原因,请先尝试并进行基准测试,您可能会对 rustc/LLVM 能够执行的某些优化感到惊讶。