move 总是复制数据吗?

at5*_*321 6 compilation llvm rust

假设我们有一个函数将相对较大的仅堆栈数据传递给另一个函数,如下所示:

fn a() {
    let arr_a: [i32; 1024] = [1, 2, 3, ...];
    b(arr_a);
}

fn b(arr_b: [i32; 1024]) {
    // ... do stuff with arr_b here
}
Run Code Online (Sandbox Code Playgroud)

用 Rust 术语来说,当b被调用时,asarr_a将被移动bs中arr_b。在幕后,整个数组是否总是被复制到堆栈上,或者编译器是否有可能通过简单地使用arr_a内存地址处的数据来优化它,而不复制它?如果是后者,编译器的哪一部分应该负责?LLVM?

注意:我知道我们可以保证数组的数据不会通过使用引用/切片来复制,但这不是这个问题的目的。