首页 > 解决方案 > Rust 会自动将函数返回的所有数据包装在 Box 中吗?

问题描述

让我们看这个例子:

fn hello() -> String {
    String::from("Hello")
}

C 中的一个等效示例是使用 malloc,将字符写入内存并返回指针。为什么 Rust 代码有效?为什么我不必这样写:

fn hello() -> Box<String> {
    Box::from(String::from("Hello"))
}

要在函数内部创建一个值并让该函数返回它,该值必须始终在堆而不是堆栈上创建,这是肯定的。为什么 Rust 使用一种乍一看就表明可以返回堆栈变量的语法?

Rust 会自动将函数返回的所有数据包装在一个Box? 或者还有其他一些 Rust 魔法吗?

我的猜测是,不要被迫将返回值包装在 a 中是一种语法糖Box

我的问题不仅限于字符串;它是关于从一般函数中返回结构的。我知道底层向量将其数据存储在堆上。这个问题只是关于结构的元数据(即指向堆上数据的指针)以及函数返回时它们如何返回(在编译器输出中)。

标签: rust

解决方案


不。

Rust 根本不会向你隐瞒任何事情。

如果你写你 return String,你将返回 a String,不多也不少。String实际上,它是一个普通的堆栈变量,只会被复制到需要的位置。

不过,您对分配数据的需求是正确的。

这是一个实现细节。要了解分配发生在哪里,我们必须看看 aString实际上是什么。

根据您对它的看法,它在内部分配可能并不令人惊讶,并且出于这个特定原因,Vec它被使用,因为它抽象了原始数据的分配。

这是 a 的字面定义String

pub struct String {
    vec: Vec<u8>,
}

String如您所见,当您创建一个新的Box.

Vec被创建,并且Vec负责分配和释放数据。

String另一方面,负责将原始数据抽象为我们所理解的典型字符串。


推荐阅读