我当时正在一本书上学习Rust分,下面的摘录让我有点抓狂:

Also note that 100 has the 101 in front of it because you need a reference to use a 102. That's because of the reason we saw above: the stack needs to know the size, and a 102 can be of any length. So we access it with a 101, a reference. The compiler knows the size of a reference's pointer, and it can then use the 101 to find where the 102 data is and read it. Also, because you use a 101 to interact with a 102, you don't own it. But a 109 is an "owned" type.

我知道对于未知大小的变量,您必须将数据放在堆上,然后在堆栈上用固定长度的指针引用它.我的困惑在于100 can be of any length这句话.

Why can't a 100 type also be of unknown length at times and require the whole reference to data on heap approach?

我知道这本书以后可能会更深入地探讨细节,但我想知道是否有人可以为我提供一些额外的背景,特别是关于上面的问题?任何关于Rust&strString类型的有用的附带细节,对于语言初学者来说都是很好的,也是非常值得赞赏的.

推荐答案

就像切片[T]一样,str是一种大小可变的类型.(事实上,str实质上是保证包含有效UTF-8的[u8].)

可变大小的字体是特别的.他们不会实现Sized的特性.对可变大小类型的引用是"胖"的:它不仅保存被引用对象的地址,还保存其大小.

因此,str意味着"内存中包含有效UTF-8数据的某个区域".&str是"这样一个区域的地址和大小".


另一方面,String是具有固定大小的 struct .它的一个成员是指向其他地方(堆上)的字符串数据的指针.从概念上讲,AStringcontainsA&str以及存储区域的未使用容量.(实际上,String是具有UTF-8保证的Vec<u8>的包装器,Vec<u8>概念上包含&[u8]加容量,但实际上是一个原始指针、大小和容量.)

因此,String所需的总内存仍然是可变的,但作为String struct 本身的部分是已知的.

为什么会是这样呢?因为String的整点是manage,一个包含字符串数据的存储区域,如果它is是包含字符串数据的存储区域,它不能做到这一点.


旁白:

我知道对于未知大小的变量,您必须将数据放在堆上

这是一种误解.堆是存放大小可变的数据的最明显位置,但是

  • 字符串文字被放置在只读存储器中,
  • 您可以在某个地方拥有一个固定大小的缓冲区(全局变量、局部堆栈数组),并在其中放置一些大小可变的数据,只要它适合,
  • 在低级别,您可以使用大约alloca个类似功能在堆栈上分配不同大小的数据.

Rust相关问答推荐

在Tauri中获取ICoreWebView 2_7以打印PDF

为什么迭代器上的`. map(...)`的返回类型如此复杂?

在使用#[NO_STD]时,如何在Rust中收到紧急消息?

变量需要parse()中的显式类型

如何在嵌套的泛型 struct 中调用泛型方法?

RUST 中的读写器锁定模式

使用启用优化的 alloc 会导致非法指令崩溃

可以在旋转循环中调用try_recv()吗?

如何在 Emacs Elisp 中获得类似格式化的 LSP?

如何从 x86_64 Mac 构建 M1 Mac?

不能将 `*self` borrow 为不可变的,因为它也被borrow 为可变的 - 编译器真的需要如此严格吗?

哪些特征通过 `Deref` 而哪些不通过?

在异步 Rust 中,Future 如何确保它只调用最近的 Waker?

Rust 将特性传递给依赖项

为什么指定生命周期让我返回一个引用?

带有库+多个二进制文件的Cargo 项目,二进制文件由多个文件组成?

有没有办法在 Rust 中对 BigInt 进行正确的位移?

如何用另一个变量向量置换 rust simd 向量?

当值是新类型包装器时,对键的奇怪 HashMap 生命周期要求

这个 match 语句的默认值应该是什么,还有一种方法可以解开 Some case (chess in rust)