【问题标题】:Can a `&str` contain a pointer to program memory in Rust?`&str` 可以包含指向 Rust 程序内存的指针吗?
【发布时间】:2018-08-13 14:48:42
【问题描述】:

第 4.3 节关于 Rust 编程语言的切片 has this paragraph:

字符串文字是切片

回想一下,我们讨论过将字符串文字存储在 二进制。既然我们了解了切片,我们就可以正确理解 字符串文字:

let s = "Hello, world!";

s 的类型在这里是&str:它是一个指向那个特定的切片 二进制点。这也是字符串字面量不可变的原因。 &str 是不可变引用。

现在,正如他们之前介绍的那样,字符串切片是一对(某种)包含一个指针和一个长度。对我来说,这一段(特别是“我们谈到字符串文字被存储在二进制文件中”和“指向那个特定点二进制文件”)似乎意味着指针直接进入程序存储器。不是堆栈,不是堆,而是处理器存储程序所包含的所有指令的实际位置。程序集的特定行,如果你愿意的话。

这是真的吗?如果不是,他们还有什么意思,实际上是如何完成的?如果我稍后有类似的问题,我该如何自己解决这个问题?

【问题讨论】:

  • String literals 是静态常量。它们不需要复制到堆或堆栈中,您可以直接在程序内存中引用它们。请注意,您还可以从 dynamically allocated strings 获取字符串切片
  • 如果您尝试在 Godbolt 的编译器资源管理器中检查此类程序,您将看到汇编伪指令('directive'?)将字符串“烘焙”到二进制文件中(在我编译时大约第 169 行它)godbolt.org/g/GBsmCt
  • @justinas 我敢肯定,如果您不必打印该示例,该示例可以缩短,但这是一个很酷的工具。我现在也必须学习(至少一点点)组装吗?
  • "不是堆栈,也不是堆,而是处理器存储程序包含的所有指令的实际位置。" - 是的,这就是他们的意思“二进制”。 “程序集的特定行,如果你愿意的话”,是的,虽然这部分不是可执行代码,但它是普通数据而不是指令。
  • @Arthur 我担心编译器会在未使用时对其进行优化,但似乎“-C opt-level=0”有助于避免这种情况。

标签: reference rust literals


【解决方案1】:

这是真的 - &'static str 字符串文字嵌入在二进制文件本身中。这不是 Rust 独有的,例如C implementations often do the same thing.

引用Rust Reference(强调我的):

字符串字面量是直接存储在最终二进制文件中的字符串,并且 所以将在'static 持续时间内有效。

它的类型是'staticduration借用的字符串切片,&'static str

有专门设计用于查找此类字符串的程序,例如strings 或只是 grep --text

相关问题:

【讨论】:

  • &'static str 字符串文字嵌入在二进制文件本身中 — 请注意答案是正确的,但非常具体:仅适用于 文字。您can create a &'static str 不是来自文字,因此不会成为二进制数据的一部分。
【解决方案2】:

&str 不是单个结构,而是两个字节序列,用于对存储在只读数据部分中的实际文本进行编码(对于 LEF,它是 .rodata,但可能因可执行格式而异)二进制文件和一个切片,其中包含此序列开始位置及其长度(以字节为单位)的信息。

切片是一个双字对象,第一个字是指向数据的指针,第二个字是它的长度。

Rust 不会检查空字节来确定字符串的结束位置,而是跟踪该文本占用的字节数以了解它的结束位置。

【讨论】:

  • 这并不适用于所有&str
  • @Shepmaster 你能详细说明一下吗?
猜你喜欢
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多