理解rust里的移动语义(1)

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
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值