rust里的移动会发生内容的复制还是名字的取代而不发生复制?
这段代码展示的内容
1. move语义其实就是复制,可以看到move前后的两个变量f,f2的地址是不一样的
2. move只会drop一次,并且是move之后的那个变量f2
3. move之后原来的变量f就失效了,不可以直接访问。这儿通过保存了f的raw指针,通过unsafe查看f对应地址处的数据,可以看到数据已经变成无意义的数据了,通过unsafe操作还是可以操作这个区块的内容,并且不会影响到f2的值(这个是必然的,因为f,f2地址不同,这儿只是强调下)
#[derive(Debug)]
struct Foo(i32);
impl Drop for Foo{
fn drop(&mut self){
println!("drop:{:p}",self);
}
}
fn main(){
let mut f = Foo(100);
println!("f的地址:{:p},f={:?}",&f,f);
let p = &mut f as *mut Foo;
let mut f2=f;
f2.0=10;
println!("f2地址:{:p},f2={:?}",&f2,f2);
unsafe{
println!("开始unsafe操作");
println!("给f2.0赋值后,解引用 *p = {:?}",*p);
(*p).0=200;
println!("给(*p).0赋值后,解引用 *p = {:?}",*p);
};
println!("给*p赋值后,f2={:?}",f2);
}
f的地址:0x7fff94d200c0,f=Foo(100)
f2地址:0x7fff94d1fff8,f2=Foo(10)
开始unsafe操作
给f2.0赋值后,解引用 *p = Foo(488447261)
给(*p).0赋值后,解引用 *p = Foo(200)
给*p赋值后,f2=Foo(10)
drop:0x7fff94d1fff8
本文通过示例代码深入解析Rust中move语义的工作原理:包括如何进行数据移动而非复制,move操作后原变量的状态及如何通过unsafe代码段访问已move变量的内存区域。
958

被折叠的 条评论
为什么被折叠?



