为什么Rust在可变引用不能别名时不优化代码?
大家好!我开始学习Rust,遇到了一个有趣的问题。我知道Rust安全的主要规则是:不能同时有两个可变引用(`&mut T`)指向同一数据。编译器通过借用系统在编译阶段严格检查这一点。
然而,我注意到一个奇怪的现象。当我编写一个简单的函数,通过可变引用传递两个数字并相加时,编译器生成的代码并不是最优的。
示例:
```rust
pub fn add(x: &mut u32, y: &mut u32) -> u32 {
*x + *y
}
```
我本以为编译器(LLVM)会理解:由于`x`和`y`是`&mut`,它们保证不指向同一内存区域(noalias)。因此,可以直接加载这些地址的值并相加。但当我查看汇编输出(例如在godbolt.org上)时,我看到编译器生成的代码包含显式的加载和解引用指令,而不是简单地相加寄存器。
为什么会这样?