首页 文章

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

提问于
浏览
3

我正在阅读Rust指南的return pointers part . 以下是它的示例代码:

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将值直接写入该指针 . 这会将返回值直接写入分配的框中 .

阅读了a related question,我仍然没有得到这里的无副本点 .

函数 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);
        }
    }
    

    main 创建 Box 并将指向框内部的指针传递给 foo 作为输入参数 . 这样, foo 可以直接存储结果值,而不是将其返回并将 main 复制到框中 .

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

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

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

    x 是我们试图复制的框,而不是新框...相反,它将指针作为隐藏参数传递 .

相关问题