数组是否在移动时被复制?

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 能够执行的某些优化感到惊讶。