Rust - 'String' 和 'str' 在内存中有何不同?

ske*_*ula 1 rust

我看过这个问题,但还是没明白,所以这就是我所知道的(可能是不正确的):

  • 初始化类型变量会在堆上String分配内存,并将指向该内存的指针存储在堆栈上。
  • 初始化类型的变量会在堆栈&str上存储一个指针,并且我假设该指针指向堆上a 。str

如果是这种情况 - 如果 和 都String在堆栈&str上存储指向String堆上内存位置的指针 - 这是否意味着和str(不是引用)是相同的?

Sha*_*tia 6

这篇文章解释得很好,并且有一些关于两者如何工作的视觉效果: https: //blog.thoughtram.io/string-vs-str-in-rust/

\n

回答你的问题,不,它们不一样。他们只能指出同一件事。

\n

AString是一个使用 s 存储文本的容器str。它拥有它指向的数据,并且可以修改它或添加/删除它。

\n

从文章中,astr是:

\n
\n

当我们引用其他人的 \xe2\x80\x9cowned\xe2\x80\x9d 的 UTF-8 文本范围时,或者当我们使用字符串文字创建它们时,我们会使用字符串切片(或 str)。 。

\n
\n

所以str只能指向数据,也可以指向某些数据的子串。但它不拥有数据,也无法修改数据。

\n

  • 简而言之:“String”[字面意思是“Vec<u8>”](https://doc.rust-lang.org/1.48.0/src/alloc/string.rs.html#279-281),和“ &str` [字面意思是 `&[u8]`](https://doc.rust-lang.org/1.48.0/src/core/str/converts.rs.html#161-165)。 (3认同)