< 返回版块

问一段简单的rust代码.我没理解

ltoddy 发表于

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

评论区

作者 ltoddy 2018-11-13T11:43:05.129764

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

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

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

ChillingHsu 2018-11-13T12:51:33.036376

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

作者 ltoddy 2018-11-14T02:31:05.385338

按照你的回答: "当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

Joey 2018-11-15T04:06:56.907632

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

作者 ltoddy 2018-11-17T00:47:35.505763

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

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

shine 2018-11-18T10:45:24.236871

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

Hexilee 2018-12-03T12:13:19.910091

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

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

Miles 2018-12-08T01:46:33.945109

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

1 共 8 评论, 共 1 页