Avatar ·

为什么Rust不通过假设两个可变引用没有别名来优化代码?

大家好!我正在学习Rust,并试图理解编译器如何利用安全保证来优化代码。众所周知,在Rust中,可变引用(`&mut T`)是唯一的:在任何时刻,只能存在一个对数据的可变引用。这个规则由编译器在借用检查阶段保证。按理说,这应该为LLVM提供强大的优化提示,类似于C/C++中的`restrict`。然而,我注意到在一些简单的基准测试中,Rust生成的代码并没有利用这个假设。 下面是一个简单的例子: ```rust pub fn add_assign(x: &mut u32, y: &mut u32) { *x += *y; *x += *y; } ``` 我期望编译器将其优化为 `*x += *y * 2`,因为`x`和`y`不能指向同一块内存。但在生成的汇编代码中(例如在Compiler Explorer上),我看到两次读取和两次加法。为什么Rust不使用无别名保证来进行这种优化?难道这不是其中之一吗?