2020-09-25:rust中Point是结构体类型,【let p1=Point{x:25,y:25}...

2020-09-25:rust中Point是结构体类型,【let p1=Point{x:25,y:25};let p2=p1;】请问p1和p2是同一个对象吗?
福哥答案2020-09-25:#福大大架构师每日一题#

不是同一个对象。p1和p2直接存内容,不存地址。这点跟java里的new对象是不一样的。
p1.x和p1的地址相同,说明p1存的是内容,而不是地址。
p1.x和p2.x的地址不同,说明p1和p2的内存空间不一样,不是同一个对象。

有些人会抬杠,说rust里没有对象。
rust我学得不深入,难免会出错。反汇编,我还没看,不排除rust做了优化。有不对的地方,请直接留言,表达自己的观点,我欣然接受。

测试代码如下:

struct Point {
    x: i64,
    y: i64,
}

fn main() {
    let p1 = Point { x: 25, y: 25 };
    println!("p1.x address: {:p}", &(p1.x));
    println!("p1 address: {:p}", &p1);
    println!("p1.x和p1的地址相同,说明p1存的是内容,而不是地址。");
    println!("------------");
    let p2 = p1;
    println!("p2.x address: {:p}", &(p2.x));
    println!("p2 address: {:p}", &p2);
    println!("p1.x和p2.x的地址不同,说明p1和p2的内存空间不一样,不是同一个对象。");
}

代码运行结果如下:
图片说明


评论

福大大架构师每日一题 文章被收录于专栏

最新面试题,针对高级开发人员和架构师。内容是后端、大数据和人工智能。

全部评论
我认为是不是同一个对象不能从地址去判断,而更应该从语义上去看。比如下面这种情况,p1 和 p2 的地址是一样的,同样是 move,所有权转移: fn my_func() -> Point { let p1 = Point { x: 25, y: 25 }; println!("p1.x address: {:p}", &(p1.x)); println!("p1 address: {:p}", &p1); println!("p1.x和p1的地址相同,说明p1存的是内容,而不是地址。"); println!("------------"); p1 } fn main() { let p2 = my_func(); println!("p2.x address: {:p}", &(p2.x)); println!("p2 address: {:p}", &p2); println!("p1.x和p2.x的地址不同,说明p1和p2的内存空间不一样,不是同一个对象。"); } 但能因为地址一样就说它们是同一个对象吗? 你可以在我这段代码的基础上在main函数最开始再多调用一次my_func(),你会发现p1和p2的地址值又不相等了,难不成这俩是不是一个对象还依赖第三者?你认为p1和p2的关系不是早上在家的你和上午上班的你这种关系, 是因为你还带着其它语言的思维,在“在家的你和公司的你是不是一个人”的问题上,你上班是做地铁还是开车还是坐传送门真的重要吗?就像在 Rust 里,move 前后的对象无论地址是否相等都可以认为是一个对象, 跟地址是不是相等、是不是通过拷贝实现、还是直接优化掉这些具体实现是两回事。
3 回复 分享
发布于 2020-09-28 23:14
let p2 = p1; 是 move 语义,这句执行完之后 p1 就把所有权转移给 p2 了,它本身就不可用了。所以都它们是无法同时存在的东西,当然不是一个对象。而且这题里“同一个对象”其实是没有良好的定义的——你无法同时出现在家里和公司,早上在家的你和上午上班的你是同一个人吗?
2 回复 分享
发布于 2020-09-27 08:39

相关推荐

11-04 14:10
东南大学 Java
_可乐多加冰_:去市公司包卖卡的
点赞 评论 收藏
分享
评论
3
收藏
分享
牛客网
牛客企业服务