在Rust中返回指针时会发生什么?

4
我正在阅读 Rust 指南的 返回指针部分。以下是其中的示例代码:
struct BigStruct {
    one: int,
    two: int,
    // etc
    one_hundred: int,
}

fn foo(x: Box<BigStruct>) -> BigStruct {
    return *x;
}

fn main() {
    let x = box BigStruct {
        one: 1,
        two: 2,
        one_hundred: 100,
    };

    let y = box foo(x);
}

以下解释中的强调部分让我感到困惑:
“这段代码中没有复制。main函数为`box`分配了足够的空间,将指向该内存的指针作为x传递给foo函数,然后foo函数直接将值写入该指针。这样可以直接将返回值写入已分配的box中。
阅读了一个相关问题,我仍然不明白“无复制”这一点。
函数foo是否会返回`*x`的副本? 如果是,如何理解上述解释? 如果不是,这与所有权和借用有关吗?
我理解所有权和借用的概念,只是不知道它们发生的时间。
1个回答

4
这份指南试图告诉您,代码的行为就好像是按照这种方式编写的:
struct BigStruct {
    one: int,
    two: int,
    // etc
    one_hundred: int,
}

fn foo(x: Box<BigStruct>, result: &mut BigStruct) {
    *result = *x;
}

fn main() {
    let x = box BigStruct {
        one: 1,
        two: 2,
        one_hundred: 100,
    };

    unsafe {
        let mut y = box std::mem::uninitialized();
        foo(x, &mut *y);
    }
}
创建一个并将指向该Box内部的指针作为输入参数传递给。这样,就可以直接将结果值存储在那里,而不是返回它并让
将其复制到中。

中发生了一次复制(从第一个到第二个),但如果没有直接写入,则会有两个副本(可能是从第一个到堆栈中,然后从堆栈到

中的第二个)。

P.S .:我认为指南中有一个错误。它说:

将指向该内存的指针作为x传递给

但是我们要复制的,而不是新的...相反,它会传递一个指针作为隐藏参数。


根据我最近阅读的内容,这似乎是一个合理且正确的答案。我记得C++曾经使用过类似的机制。 - Windor C
顺便问一下,你有关于复制和移动的更详细线索吗?我已经阅读了所有能找到的文章,除了源代码。 - Windor C
我建议您发布一个新问题。这样我们就能够更详细地回答您的问题。 - Francis Gagné

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接