< 返回版块

ltoddy 发表于 2018-11-13 19:32

#[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).

评论区

写评论
Miles 2018-12-08 09:46

官方book里面有很明确的解释

Hexilee 2018-12-03 20:13

这里不是显然 memcopy 了吗,还有啥好争的。当然在不打印地址且 release 的情况下,这个函数会被内联,这样是没有 memcopy 的。

@shine rect1 和 area:rect 都指向 Rectangle , 但是 传参后发生了move, 所以 rect1 不在对 Rectangle拥有所有权, 但是area:react 有, 你打印的地址应该是 一个实参的一个是 rect1, 地址当然不一样, 你可以 &Rectangle{} 然后发现他们是一样的

shine 2018-11-18 18:45

rect1 和 area:rect 都指向 Rectangle , 但是 传参后发生了move, 所以 rect1 不在对 Rectangle拥有所有权, 但是area:react 有, 你打印的地址应该是 一个实参的一个是 rect1, 地址当然不一样, 你可以 &Rectangle{} 然后发现他们是一样的

作者 ltoddy 2018-11-17 08:47

我打印过地址, 两个地址不一样.

@Joey rect1传给area这个函数之后,rect1变量的所有权从main函数转移到area函数里面,但是area函数执行完没有把rect1的所有权交回到main函数中,所以这个变量就成为 shallow了,main和area中的变量其实是同一份,这样数据没有发生复制,效率更高。

Joey 2018-11-15 12:06

rect1传给area这个函数之后,rect1变量的所有权从main函数转移到area函数里面,但是area函数执行完没有把rect1的所有权交回到main函数中,所以这个变量就成为 shallow了,main和area中的变量其实是同一份,这样数据没有发生复制,效率更高。

作者 ltoddy 2018-11-14 10:31

按照你的回答: "当area调用完成之后,自然就会回收它拥有的rect,也就是你的rect1".

rect1 是在 area结束之后回收.

其实他是在area执行之前回收的, 让 rect1 传给area之后, 还没area执行的时候, rect1就已经给回收了, 这样rust才能做到 ownship 的move.

假设按你说的, area结束后回收 rect1, rect1 是在main中定义的, area怎么干涉main 的.

@ChillingHsu 因为你在调用area函数时,将rect1的所有权传递到了area的参数rect中。当area调用完成之后,自然就会回收它拥有的rect,也就是你的rect1

ChillingHsu 2018-11-13 20:51

因为你在调用area函数时,将rect1的所有权传递到了area的参数rect中。当area调用完成之后,自然就会回收它拥有的rect,也就是你的rect1

作者 ltoddy 2018-11-13 19:43

我添加了打印地址的语句,结果是:

area ==> addr: 0x7FFEC4993A18
main ==> addr: 0x7FFEC4993AA8

这我就好奇, area作用域结束后, 回收 rect, 怎么 main中的rect1 跟着go die了.

1 共 8 条评论, 1 页