繁体   English   中英

为什么 Rust 中的字符串文字是 &str 而不是 String?

[英]Why are string literals &str instead of String in Rust?

我只是问为什么 Rust 决定对字符串文字使用&str而不是String 是不是有可能生锈字符串文字只是自动转换为String ,并把它放在堆,而不是把它入堆栈的?

要理解推理,请考虑 Rust 想成为一种系统编程语言。 一般来说,这意味着它需要(除其他外)(a)尽可能高效,(b)让程序员完全控制堆内存的分配和释放。 Rust 的一个用例是用于内存非常有限的嵌入式编程。

因此,Rust 不想在并非绝对必要的情况下分配堆内存。 字符串文字在编译时是已知的,可以写入可执行文件/库的ro.data部分,因此它们不会消耗堆栈或堆空间。

现在,鉴于 Rust 不想在堆上分配值,它基本上被迫将字符串文字视为&strString拥有它们的值并且可以移动和删除,但是如何删除ro.data的值ro.data 你真的不能那样做,所以&str是完美的选择。

此外,将字符串文字视为&str (或更准确地说是&'static str )具有所有优点,但没有任何缺点。 它们可以在多个地方使用,可以共享而不必担心使用堆内存并且永远不必删除。 此外,它们可以随意转换为拥有的String ,因此始终可以将它们作为String使用,但您只需在需要时支付费用。

要创建String ,您必须:

  • 在堆上保留一个位置(分配),和
  • 将所需内容从只读位置复制到新分配的区域。

如果像"foo"这样的字符串字面量两者都做,那么每个字符串实际上会被分配两次:一次在可执行文件中作为只读字符串,另一次在堆中。 您不能仅仅引用存储在可执行文件中的原始只读数据。

&str文字使您可以访问最有效的字符串数据:启动时出现在可执行映像中的数据,由编译器与构成程序的指令一起放在那里。 它指向的数据没有存储在堆栈中,堆栈分配的只是指针/大小对,就像任何 Rust 切片的情况一样。

"foo" desugar 变成现在拼写为"foo".to_owned()会使其变慢且空间效率较低,并且可能需要另一种语法来获得非分配&str 毕竟,您不希望x == "foo"分配一个字符串只是为了立即将其丢弃。 像 Python 这样的语言通过使它们的字符串不可变来缓解这个问题,这允许它们缓存源代码中提到的字符串。 在 Rust 中,改变String通常是创建它的重点,因此该策略不起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM