【发布时间】:2020-05-23 07:25:32
【问题描述】:
我认为从一个绑定移动到另一个绑定的对象仅仅意味着对象位本身保持不变;只是该程序源使用不同的绑定(标识符)引用它。
use std::fmt;
struct Person {
name: String,
age: u8,
}
impl Clone for Person {
fn clone(&self) -> Self {
Person {
name: self.name.clone(),
age: self.age,
}
}
}
impl fmt::Pointer for Person {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let ptr = self as *const Self;
fmt::Pointer::fmt(&ptr, f)
}
}
fn main() {
let p = Person {
name: "Krishna".to_string(),
age: 8,
};
println!("{:p}", p);
let a = p.clone();
println!("{:p}", a);
let q = p; // moved
println!("{:p}", q);
}
打印出来
0x7ffee28b4178 // P
0x7ffee28b41f8 // A (P's clone)
0x7ffee28b4260 // Q (moved from P)
为什么p和q的地址不一样?它是用rustc test.rs编译的。
【问题讨论】:
-
如果你想要一个固定地址,这就是
Pin的用途 -
仅仅通过使用他们的地址你可能不允许优化次数。
-
@Stargateur 当然,这只是一个更好地理解语言概念的玩具程序。谢谢!
-
感谢您让我们知道
Pin,但想要保持内存位置不变是另一回事。我想知道的是 Rust 的秘密行动。
标签: rust