rust - 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 根本不会向你隐瞒任何事情。
如果你写你 return String
,你将返回 a String
,不多也不少。String
实际上,它是一个普通的堆栈变量,只会被复制到需要的位置。
不过,您对分配数据的需求是正确的。
这是一个实现细节。要了解分配发生在哪里,我们必须看看 aString
实际上是什么。
根据您对它的看法,它在内部分配可能并不令人惊讶,并且出于这个特定原因,Vec
它被使用,因为它抽象了原始数据的分配。
这是 a 的字面定义String
:
pub struct String {
vec: Vec<u8>,
}
String
如您所见,当您创建一个新的Box
.
Vec
被创建,并且Vec
负责分配和释放数据。
String
另一方面,负责将原始数据抽象为我们所理解的典型字符串。
推荐阅读
- javascript - PHP / MySQL:多次删除出错,只删除了最新的ID
- swift - 获取分段上传 Alamofire5 的上传进度
- java - 如何编写一个测试来检查远程 git 分支上是否存在特定文件?
- python - 如何在多对多字段中查询具有所有给定对象的对象?
- devops - 使用 pulumi Vs aws cdk 进行基础设施配置
- javascript - 如何在 discordjs 12 中通过 id 获取用户?
- python - 使用它们的名称从一组变量中创建一个字典
- gitlab - 如何在gitlab中显示20多条历史流水线?
- flutter - Flutter-按下后退按钮时如何重定向到特定活动?
- php - PHP 关联组