我的直觉对移动和复制肯定是错误的.我希望Rust编译器将不可变值的移动优化为无操作.由于该值是不可变的,因此我们可以在移动后安全地重用它.但是Rust 1.65.0 on Godbolt编译成程序集,将值复制到内存中的新位置.我正在研究的铁 rust 代码:
pub fn f_int() {
let x = 3;
let y = x;
println!("{}, {}", x, y);
}
生成的部件具有-C opt-level=3
:
; pub fn f_int() {
sub rsp, 88
; let x = 3;
mov dword ptr [rsp], 3
; let y = x;
mov dword ptr [rsp + 4], 3
mov rax, rsp
...
为什么let y = x;
等于mov dword ptr [rsp + 4], 3
和mov rax, rsp
?为什么编译器不将y
视为与程序集中的x
相同的变量?
(This question看起来很相似,但它是关于不是复制的字符串.我的问题是关于复制的整数.看起来我所描述的并不是一个错失的优化机会,而是我理解上的一个根本错误.)