#[derive(Debug)]
struct Rectangle {
width: u32,
height: u32,
}
fn area(rect: Rectangle) -> u32 {
return rect.width * rect.height;
}
fn main() {
let rect1 = Rectangle { width: 10, height: 20 };
let a = area(rect1);
println!("{:?}", a);
}
这是一段很简单的代码, 有一个结构体: Rectangle
, 和一个函数 area
, 然后我创建了一个 rect1 变量.
把这个变量传给了 area
函数, area
作用域结束后, rect 生命结束, 回收.
那么我一直不解的是, rust 的传参数方式到底是怎么传参数的.
我在 main
函数中定义的 rect1 变, 然后area调用rect1, 在area和main中的是一个吗?
或者说谁能给我段与之等价的C语言代码(附带free).
1
共 8 条评论, 1 页
评论区
写评论官方book里面有很明确的解释
这里不是显然 memcopy 了吗,还有啥好争的。当然在不打印地址且 release 的情况下,这个函数会被内联,这样是没有 memcopy 的。
rect1 和 area:rect 都指向 Rectangle , 但是 传参后发生了move, 所以 rect1 不在对 Rectangle拥有所有权, 但是area:react 有, 你打印的地址应该是 一个实参的一个是 rect1, 地址当然不一样, 你可以 &Rectangle{} 然后发现他们是一样的
我打印过地址, 两个地址不一样.
rect1传给area这个函数之后,rect1变量的所有权从main函数转移到area函数里面,但是area函数执行完没有把rect1的所有权交回到main函数中,所以这个变量就成为 shallow了,main和area中的变量其实是同一份,这样数据没有发生复制,效率更高。
按照你的回答: "当area调用完成之后,自然就会回收它拥有的rect,也就是你的rect1".
rect1 是在 area结束之后回收.
其实他是在area执行之前回收的, 让 rect1 传给area之后, 还没area执行的时候, rect1就已经给回收了, 这样rust才能做到 ownship 的move.
假设按你说的, area结束后回收 rect1, rect1 是在main中定义的, area怎么干涉main 的.
因为你在调用
area
函数时,将rect1
的所有权传递到了area
的参数rect
中。当area
调用完成之后,自然就会回收它拥有的rect
,也就是你的rect1
我添加了打印地址的语句,结果是:
这我就好奇, area作用域结束后, 回收 rect, 怎么 main中的rect1 跟着go die了.