【发布时间】: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”有助于避免这种情况。