ptr::eq() 与 ptr::addr_eq() 函数
它们都用于比较原始指针 (*const T) 是否相等.
pub fn eq<T>(a: *const T, b: *const T) -> bool
where
T: ?Sized;
pub fn addr_eq<T, U>(p: *const T, q: *const U) -> bool
where
T: ?Sized,
U: ?Sized;
可以看到, 它们的定义是差不多的. 区别在于:
eq()
除了比较胖指针的指针地址外, 还会比较胖指针里的 metadata, 例如 (length, vtable 等等)addr_eq()
只比较胖指针的指针地址, 只要地址相同, 就返回 true
看下面的例子:
use std::fmt; use std::ptr; fn main() { let msg: String = "Hello, Rust".to_owned(); let msg2: String = "Hello, Rust".to_owned(); let msg_ref: &dyn fmt::Debug = &msg; let msg_ref2: &dyn fmt::Debug = &msg; let msg_dsp_ref: &dyn fmt::Display = &msg; let msg2_ref: &dyn fmt::Debug = &msg2; assert!(ptr::eq(msg_ref, msg_ref2)); assert!(!ptr::eq(msg_ref, msg2_ref)); assert!(ptr::addr_eq(msg_ref, msg_dsp_ref)); assert!(!ptr::addr_eq(msg_ref, msg2_ref)); }
上面的代码中的变量, 其内存布局大致如下图所示, 要注意里面的 trait object 的指针: