为什么引用比较对常量有效,而对具有相同值的变量无效



在下面的代码中:

fn is_five(x: &i32) -> bool {
x as *const i32 == &5 as *const i32
}
fn main() {
let x = 5;
assert!(!is_five(&x));
assert!(is_five(&5));
assert!(!is_five(&6));
println!("Success!");
}

为什么is_five(&x)为假,而is_five(&5)为真?


Rust游乐场中的代码演示

编写&5以获取常量的地址可能看起来很奇怪,但在这种情况下,编译器决定使用存储器(在常量部分(并存储此值,以便能够获取其地址。如果这种情况在代码中发生多次,则不需要有单独的存储,所有存储都具有相同的值。

如果您在godbolt中尝试以下代码,您将看到常量5在内存中放置一次,并且链接器从多个位置引用它。

is_five():lea rax, [rip + .L__unnamed_1]

test2():lea rdi, [rip + .L__unnamed_1]

因此,&5指的是相同的地址,但作为局部变量的&x指的是用相同值初始化的x的另一存储器(5(。

test1():lea rdi, [rsp + 4]

pub fn is_five(x: &i32) -> bool {
x as *const i32 == &5 as *const i32
}
pub fn test1() -> bool {
let x = 5;
is_five(&x)
}
pub fn test2() -> bool {
is_five(&5)
}

如果引用和指针比较之间的区别不清楚,本文档可以提供帮助。

最新更新